什么是将结构写入C中的文件的可移植方式?
我需要以可移植的方式将C struct
序列化到文件中,以便我可以在其他机器上读取该文件,并且可以保证我将获得与放入的相同的内容。
文件格式无关紧要,只要它相当紧凑(如果不是为了可移植性问题,写出结构的内存中表示将是理想的。)
有一种干净的方法可以轻松实现这一目标吗?
您实际上是在设计二进制网络协议,因此您可能希望使用现有的库(如Google的协议缓冲区)。 如果您仍想设计自己的,可以通过这样做来实现编写原始结构的合理可移植性:
- 打包你的结构(GCC的
__attribute__((packed))
,MSVC的#pragma pack
。 这是特定于编译器的。 - 确保整数字节顺序正确(
htons
,htonl
)。 这是特定于体系结构的。 - 不要对字符串使用指针(使用字符缓冲区)。
- 使用C99精确整数大小(
uint32_t
等)。 - 确保代码仅编译
CHAR_BIT
为8的位置,这是最常见的,或以其他方式处理字符串到8位八位字节流的转换。 在某些环境中,CHAR_BIT
!= 8,但它们往往是专用硬件。
有了这个,只要您使用相同的结构定义,您就可以合理地确定在另一端获得相同的结果。 我不确定浮点数表示,但我通常避免发送它们。
与您可能要解决的可移植性无关的另一个问题是通过引入长度作为第一个字段和/或使用版本标记来向后兼容。
您可以尝试使用协议缓冲区等库; 滚动你自己可能不值得努力。
写一个输出function。 使用sprintf将每个字段的ascii表示打印到文件中,每行一个字段。
写一个输入function。 使用fgets从文件中加载每一行。 使用scanf转换为二进制文件,直接转换为结构中的字段。
如果您计划使用许多不同的结构执行此操作,请考虑为每个文件添加标头,以标识它所代表的结构类型。