代码之家  ›  专栏  ›  技术社区  ›  Justin

用C语言将结构写入文件的可移植方法是什么?

  •  13
  • Justin  · 技术社区  · 14 年前

    我需要序列化一个C struct 以可移植的方式读取一个文件,这样我就可以在其他机器上读取该文件,并且可以保证我将得到与放入的文件相同的内容。

    只要文件格式合理紧凑(如果不考虑可移植性问题,那么写出结构的内存表示形式是理想的)就无所谓了

    有没有一种干净的方法可以轻易地做到这一点?

    3 回复  |  直到 12 年前
        1
  •  17
  •   Alex B    14 年前

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

    1. 打包结构(GCC的 __attribute__((packed)) ,MSVC的 #pragma pack ). 这是编译器特有的。
    2. 确保你的整数结束是正确的( htons , htonl ). 这是特定于体系结构的。
    3. 不要对字符串使用指针(使用字符缓冲区)。
    4. 使用C99精确整数大小( uint32_t 等等)。
    5. 确保代码只在 CHAR_BIT 是8,这是最常见的,或者处理字符串到8位八位字节流的转换。有些环境 字符位 !=8,但它们往往是专用硬件。

    这样,只要使用相同的结构定义,就可以合理地确定在另一端会得到相同的结果。不过,我不确定浮点数的表示,但我通常会避免发送它们。

    与可移植性无关的另一件事是通过引入长度作为第一个字段和/或使用版本标记来实现向后兼容性。

        2
  •  2
  •   lijie    14 年前

    您可以尝试使用一个库,如协议缓冲区;滚动您自己的库可能不值得这么做。

        3
  •  0
  •   EvilTeach    14 年前

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

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

    如果你打算用很多不同的结构来做这个, 考虑在每个文件中添加一个头,它标识什么类型的结构 它代表。