在C语言中将结构写入文件的可移植方式是什么?

时间:2010-11-25 05:37:45

标签: c serialization

我需要以可移植的方式将C struct序列化到文件中,以便我可以在其他计算机上读取该文件,并且可以保证我将获得与放入的相同的内容。

文件格式无关紧要,只要它相当紧凑(如果不是为了便携性问题,写出结构的内存中表示将是理想的。)

有一种干净的方法可以轻松实现这一目标吗?

3 个答案:

答案 0 :(得分:17)

您实际上是在设计二进制网络协议,因此您可能希望使用现有的库(如Google的协议缓冲区)。如果您仍想设计自己的,可以通过这样做来实现编写原始结构的合理可移植性:

  1. 打包你的结构(GCC的__attribute__((packed)),MSVC的#pragma pack)。这是特定于编译器的。
  2. 确保整数字节顺序正确(htonshtonl)。这是特定于体系结构的。
  3. 不要对字符串使用指针(使用字符缓冲区)。
  4. 使用C99完全整数(uint32_t等)。
  5. 确保代码仅编译CHAR_BIT为8的位置,这是最常见的,或以其他方式处理字符串到8位八位字节流的转换。在某些环境中CHAR_BIT!= 8,但它们往往是专用硬件。
  6. 通过这种方式,您可以合理地确定只要使用相同的结构定义,您将在另一端获得相同的结果。我不确定浮点数表示,但我通常会避免发送它们。

    您可能希望解决的与可移植性无关的另一个问题是向后兼容性,方法是将长度作为第一个字段引入,和/或使用版本标记。

答案 1 :(得分:2)

您可以尝试使用协议缓冲区等库;滚动你自己可能不值得努力。

答案 2 :(得分:0)

为输出编写一个函数。 使用sprintf将每个字段的ascii表示打印到文件中, 每行一个字段。

写一个输入功能。 使用fgets从文件中加载每一行。 使用scanf转换为二进制文件,直接转换为结构中的字段。

如果您计划使用许多不同的结构, 考虑为每个文件添加一个标题,标识哪种结构 它代表着。