prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 2.11

Q如何从数据文件中读取/写入结构体?


A使用`fwrite`:

	fwrite(&somestruct, sizeof somestruct, 1, fp);
和相应的fread调用将其读回,将结构体写出相对简单。这里发生的是`fwrite`接收结构体的指针,并将其写入(或fread相应地读取)结构体的内存映像作为字节流。 的sizeof运算符确定结构体占用的字节数。

(对`fwrite`的调用如上所述,在 ANSI 编译器下是正确的,只要`fwrite`的原型在范围内,通常是因为<stdio.h>#included。

但是,以这种方式作为内存映像写入的数据文件不可移植,特别是如果它们包含浮点字段或指针。结构体的内存布局是机器和编译器依赖的。不同的编译器可能使用不同量的填充(请参阅问题 2.12),并且基本类型的字节大小和字节顺序在机器之间是不同的。因此,作为内存映像写入的结构体不一定能被在其他机器上运行(甚至由其他编译器编译)的程序读回,如果你的数据文件要在机器之间交换,这是一个重要的考虑因素。另请参阅问题 2.1220.5

另外,如果结构体包含任何指针(char *字符串,或指向其他数据结构的指针),只写入指针值,并且它们在读回时很可能无效。最后,请注意,为了广泛的可移植性,在打开文件时必须使用"b"标志;请参阅问题 12.38

一个更具可移植性的解决方案,尽管它最初需要一些额外的工作,但它是通过逐字段编写一对函数来编写和读取结构体,以可移植的(甚至可能是人类可读的)方式。

参考:H&S 第 15.13 节,第 381 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管