C fread()操作将错误数据补充到结构中

C fread()操作将错误数据补充到结构中,c,database,file,structure,C,Database,File,Structure,我正在使用fwrite和fread将上述结构存储在文件中。现在,在将学生记录存储在文件中之后,我正在修改结构,如下所示 typedef struct student { char name[10]; int roll; char subject[5]; int mark; }STUDENT; 现在,我正在读取以前存储在文件中的旧记录。我正在使用fread()来执行此操作。问题是未正确地从subject中的文件读取数据,并将数据标记为结构的成员。这取决于您如何读取

我正在使用fwrite和fread将上述结构存储在文件中。现在,在将学生记录存储在文件中之后,我正在修改结构,如下所示

typedef struct student
{
    char name[10];
    int roll;
    char subject[5];
    int mark;
}STUDENT;

现在,我正在读取以前存储在文件中的旧记录。我正在使用fread()来执行此操作。问题是未正确地从subject中的文件读取数据,并将数据标记为结构的成员。

这取决于您如何读取文件。如果将
fread
读入新结构,请使用
sizeof(student)
,因为缺少“roll”,旧的roll值将读入新结构中的
subject[5]
。您可以使用
fscanf
将值显式加载到每个字段中。

这是因为文件仍然包含旧结构中的数据。总共是10+(+2)+4+5+(+3)+3(+1)=28个字节-括号中的值是结构填充

当您从包含旧格式数据的文件中执行
fread
到新结构时,4个字节的
int roll
将在
字符主题[5]的前4个字节处结束
,而
主题
的最后第5个元素将是前一个
主题
的第一个字节。类似的想法也适用于
标记
字段


如果你想读写这样的结构——也就是说,通过对它进行二进制复制——你需要保留旧的格式,即使它不再使用。更好的办法是使用某种序列化库。Google的“协议缓冲区”只是此类库的众多示例之一,它可能会让您了解如何解决此类问题。

谢谢,您能否提供有关序列化库入门的参考资料?这将非常有帮助。@user5979363对于我提到的协议缓冲区,您可以在这里找到一个很好的教程:
typedef struct student
{
    char name[10];

    char subject[5];
    int mark;
}STUDENT;