为什么我增加个成员就可以了?好无语

 #include<stdio.h>
#include<stdlib.h>
struct st
{
    char name[4];
    char age[3];
    char tel[9];
}s[3];
void main()
{
    int i,n;
    FILE *fpe; FILE *fpo;
    for(i=0;i<3;i++)
    {
        scanf_s("%s",s[i].name,4);getchar();
        scanf_s("%s",s[i].age,3);getchar();
        scanf_s("%s",s[i].tel,9);getchar();
    }
    fopen_s(&fpo,"e:\\students.txt","w");
    if(fpo==NULL)
    {
        printf("打不开\n");
        exit(0);
    }
    for(i=0;i<3;i++)
    {
        n=fwrite(&s[i],sizeof(struct st),1,fpo);
        if(n!=1)
            printf("file write error");
    }
    fclose(fpo);
    fopen_s(&fpe,"e:\\students.txt","r");
    if(fpe==NULL)
    {
        printf("打不开\n");
        exit(0);
    }
    for(i=0;i<3;i++)
    {
        n=fread(&s[i],sizeof(struct st),1,fpe);
        if(n!=1)
            printf("file read error");
        printf("%-4s%3s%9s\n",s[i].name,s[i].age,s[i].tel);
    }
    fclose(fpe);
    system("pause");
}

图片说明
图片说明

确实是一个奇怪的问题,只增加一个变量就一切 OK 的话,这明显与我们猜的字符串编码无关!
建议你将输入在写入文件前,先输出确认一下:主要的目的是看看有没有什么越界、或者其它可能的情况出现。

之前回答你了,因为windows xp的记事本没有办法直接识别编码——但是情况比较复杂的是,它在没有unicode编码头的文件上会实现猜测编码,根据文本的内容,这种猜测有时候会出问题。

以前网上流传一个段子,说的是记事本输入联通,保存,出来的是乱码,其实就是这个原理。

与Windows记事本的编码方式有关,如果使用UE打开,则截图如下:
图片说明,写入的数据没有问题,只是显示失败罢了