Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用于结构化数据的fread和fwrite的替代方案_C_Portability - Fatal编程技术网

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

C 用于结构化数据的fread和fwrite的替代方案,c,portability,C,Portability,书上说 “请注意,不建议将fread和fwrite用于结构化数据。部分问题在于,使用fwrite编写的文件可能无法在不同的计算机之间移植。” 这到底是什么意思?如果我想编写便携式结构化数据读写器,我应该使用什么调用?直接系统调用?这本书明智地警告不要将文件中的字节块直接读取到数据结构中 问题在于,数据结构的各个元素之间可能存在未命名的填充字节,这些字节的数量和位置完全取决于实现 您仍然可以使用fread和fwrite调用从文件中读取和写入数据,但是您应该单独读取和写入数据结构的每个元素,而不是一

书上说

“请注意,不建议将fread和fwrite用于结构化数据。部分问题在于,使用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
使用的特定位数(这可能因平台甚至编译器设置而异)。