用于结构化数据的fread和fwrite的替代方案

WuF*_*uFa 5 c portability

这本书开始的Linux程序设计(第三版)说:

"请注意,建议不要将fread和fwrite用于结构化数据.部分问题是用fwrite编写的文件可能在不同的机器之间不可移植."

这究竟是什么意思?如果我想编写便携式结构化数据读取器或写入器,我应该使用哪些调用?直接系统调用?

Jam*_*lis 3

这本书明智地警告不要将文件中的字节块直接读取到数据结构中。

这样做的问题是,数据结构的各个元素之间可能存在未命名的填充字节,并且这些字节的数量和位置完全依赖于实现。

您仍然可以使用freadfwrite调用从文件读取数据或向文件写入数据,但您应该单独读取和写入数据结构的每个元素,而不是一次读取或写入整个结构。

您还需要牢记其他可移植性问题。例如,各种数字类型具有依赖于实现的大小。为了可移植性,您可以使用标头中定义的类型stdint.h

浮点和无符号整数表示也可能存在差异,但大多数系统和文件格式现在分别使用 IEEE 754 和补码,因此这些类型的兼容性问题很少出现。只要确保您知道您的规格说明即可。