这本书开始的Linux程序设计(第三版)说:
"请注意,建议不要将fread和fwrite用于结构化数据.部分问题是用fwrite编写的文件可能在不同的机器之间不可移植."
这究竟是什么意思?如果我想编写便携式结构化数据读取器或写入器,我应该使用哪些调用?直接系统调用?
这本书明智地警告不要将文件中的字节块直接读取到数据结构中。
这样做的问题是,数据结构的各个元素之间可能存在未命名的填充字节,并且这些字节的数量和位置完全依赖于实现。
您仍然可以使用fread和fwrite调用从文件读取数据或向文件写入数据,但您应该单独读取和写入数据结构的每个元素,而不是一次读取或写入整个结构。
您还需要牢记其他可移植性问题。例如,各种数字类型具有依赖于实现的大小。为了可移植性,您可以使用标头中定义的类型stdint.h。
浮点和无符号整数表示也可能存在差异,但大多数系统和文件格式现在分别使用 IEEE 754 和补码,因此这些类型的兼容性问题很少出现。只要确保您知道您的规格说明即可。