这本书 Beginning Linux Programming (3rd ed) 说
“请注意,建议不要将fread和fwrite用于结构化数据。部分问题是使用fwrite编写的文件可能在不同的计算机之间不可移植。”
这究竟是什么意思?如果我想编写便携式结构化数据读取器或写入器,我应该使用哪些调用?直接系统调用?
答案 0 :(得分:3)
本书明智地告诫不要将文件中的字节块直接读入数据结构。
问题在于数据结构的各个元素之间可能存在未命名的填充字节,这些字节的数量和位置完全取决于实现。
您仍然可以使用fread
和fwrite
调用来读取和写入文件中的数据,但是您应该单独读取和写入数据结构的每个元素,而不是读取或写入整个结构一下子。
您还需要牢记其他可移植性问题。例如,各种数字类型具有依赖于实现的大小。为了便于移植,您可以使用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等。
几年后问问自己的数据和申请?...
文本表示通常不像二进制表示那么“脆弱”。