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

时间:2010-03-28 04:39:49

标签: c portability

这本书 Beginning Linux Programming (3rd ed)

  

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

数据序列化是您感兴趣的主题。

它是关于变量的大小,它是关于编码(字符串可能是utf-8,utf16 ......等),它是关于endianess(BigEndian,LowEndian)。

对于便携式解决方案I would recommend you to take a look at Google ProtocolBuffers and Thrift

答案 2 :(得分:0)

如果您担心portability数据,则应该查看Serialization技术和库,特别是s11n JSON YAML {{ 3}} XDR ASN1 Jansson等。

几年后问问自己的数据和申请?...

文本表示通常不像二进制表示那么“脆弱”。