我想从文件中读取一些数据。说一个整数:
fread(&var1, 4, 1, f);
其中var1是整数。但后来我开始认为这不安全,因为没有任何保证整数是4个字节长。 (为了这个问题,我忽略了其他问题,如feof和ferror)。
我也很快意识到,除了int size之外,还有更多的问题,比如系统的字节序,还有其他一些我甚至都没有想过的问题。
那么,确保正确读入数据的最佳方法是什么?到目前为止,我唯一能想到的是将数据存储为文本而不是二进制数据,在文本中读取,并在运行时进行转换。我猜想,无论解决方案如何,如果你想确保它是可移植的,它总是会涉及某种形式的转换。
谢谢。
答案 0 :(得分:4)
为避免尺寸问题,您应该这样做:
fread(&var1, sizeof(var1), 1, f);
如果您担心int
的大小在写入数据的平台和读取数据的平台之间可能会有所不同,那么您就会遇到更基本的问题。在这种情况下,您应该避免使用int
,short
等,并使用<stdint.h>
中定义的类型,例如int16_t
,uint32_t
。< / p>
要处理字节序问题,您应该考虑编写以已知顺序显式写/读单个字节的辅助函数,例如:
void write_uint32_t(uint8_t *buf, uint32_t x)
{
buf[0] = (uint8_t)(x >> 0);
buf[1] = (uint8_t)(x >> 8);
buf[2] = (uint8_t)(x >> 16);
buf[3] = (uint8_t)(x >> 24);
}
以上所有内容仅适用于整数类型。对于浮点类型,没有完美的通用解决方案。
答案 1 :(得分:1)
始终使用sizeof()
运算符来获取类型的大小。永远不要依赖硬编码值!