C 用于结构化数据的fread和fwrite的替代方案
书上说 “请注意,不建议将fread和fwrite用于结构化数据。部分问题在于,使用fwrite编写的文件可能无法在不同的计算机之间移植。”C 用于结构化数据的fread和fwrite的替代方案,c,portability,C,Portability,书上说 “请注意,不建议将fread和fwrite用于结构化数据。部分问题在于,使用fwrite编写的文件可能无法在不同的计算机之间移植。” 这到底是什么意思?如果我想编写便携式结构化数据读写器,我应该使用什么调用?直接系统调用?这本书明智地警告不要将文件中的字节块直接读取到数据结构中 问题在于,数据结构的各个元素之间可能存在未命名的填充字节,这些字节的数量和位置完全取决于实现 您仍然可以使用fread和fwrite调用从文件中读取和写入数据,但是您应该单独读取和写入数据结构的每个元素,而不是一
这到底是什么意思?如果我想编写便携式结构化数据读写器,我应该使用什么调用?直接系统调用?这本书明智地警告不要将文件中的字节块直接读取到数据结构中 问题在于,数据结构的各个元素之间可能存在未命名的填充字节,这些字节的数量和位置完全取决于实现 您仍然可以使用
fread
和fwrite
调用从文件中读取和写入数据,但是您应该单独读取和写入数据结构的每个元素,而不是一次读取或写入整个结构
您还需要记住其他一些关于可移植性的问题。例如,各种数字类型的大小取决于实现。为了便于移植,您可以使用stdint.h
标题中定义的类型
浮点和无符号整数表示形式也可能有所不同,但大多数系统和文件格式现在分别使用IEEE 754和two’s-complete,因此这些类型的兼容性问题要少得多。只需确保您知道您的规格说明。数据序列化是您感兴趣的主题 它是关于变量的大小,它是关于编码(字符串可能是utf-8,utf16…等等),它是关于endian(BigEndian,LowEndian) 对于便携式解决方案。如果您关心数据的安全性,您应该特别关注技术和库等 问问自己几年后你的数据和你的应用程序
文本表示通常比二进制表示更不“脆弱”。非常感谢。这似乎与fread或fwrite无关,因为据我所知,数据结构总是依赖于实现进行填充。在谈论像fread或fwrite这样的特定调用时,是否有必要强调这个问题?@forest:正是因为fread/fwrite不知道填充,所以使用它们可能会失败。例如,给定的
struct A{int i;char c;}代码>,您需要两个fread调用(i和c各一个),而不是一个(整个结构)。关于可移植整数类型的要点是,您不需要依赖于int
使用的特定位数(这可能因平台甚至编译器设置而异)。