2 yxts122 YXTS122 于 2016.01.28 21:15 提问

为什么我增加个成员就可以了?好无语
 #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");
}

图片说明
图片说明

3个回答

91program
91program   Ds   Rxr 2016.01.28 22:39
已采纳

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

91program
91program 回复YXTS122: 我有一篇关于结构体的文章,你可以看看:http://blog.csdn.net/91program/article/details/22818865结构本实际占的空间,确实存在你所说的实际大小,与定义大小不相符合的问题,是偶数字节是必须的。然后真正的大小是多少,你可以看我的 博客文章 中的说明。
接近 2 年之前 回复
YXTS122
YXTS122 回复91program:我发现结构体必须是奇数就没事,是偶数的话,记事本里就会出现乱码
接近 2 年之前 回复
YXTS122
YXTS122 回复91program:我发现结构体的大小必须是奇数就没事,如果是偶数的话,记事本中就会出现乱码,什么道理?
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.01.28 21:31

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

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

zhao_zhi
zhao_zhi   2016.01.28 22:41

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!