Q如何从数据文件中读取/写入结构体?
A使用`fwrite`:
fwrite(&somestruct, sizeof somestruct, 1, fp);和相应的fread调用将其读回,将结构体写出相对简单。这里发生的是`fwrite`接收结构体的指针,并将其写入(或fread相应地读取)结构体的内存映像作为字节流。 的sizeof运算符确定结构体占用的字节数。
(对`fwrite`的调用如上所述,在 ANSI 编译器下是正确的,只要`fwrite`的原型在范围内,通常是因为<stdio.h>是#included。
但是,以这种方式作为内存映像写入的数据文件将不可移植,特别是如果它们包含浮点字段或指针。结构体的内存布局是机器和编译器依赖的。不同的编译器可能使用不同量的填充(请参阅问题 2.12),并且基本类型的字节大小和字节顺序在机器之间是不同的。因此,作为内存映像写入的结构体不一定能被在其他机器上运行(甚至由其他编译器编译)的程序读回,如果你的数据文件要在机器之间交换,这是一个重要的考虑因素。另请参阅问题 2.12 和 20.5。
另外,如果结构体包含任何指针(char *字符串,或指向其他数据结构的指针),只写入指针值,并且它们在读回时很可能无效。最后,请注意,为了广泛的可移植性,在打开文件时必须使用"b"标志;请参阅问题 12.38。
一个更具可移植性的解决方案,尽管它最初需要一些额外的工作,但它是通过逐字段编写一对函数来编写和读取结构体,以可移植的(甚至可能是人类可读的)方式。
参考:H&S 第 15.13 节,第 381 页