C 使用stdio加载数据时处理不同的体系结构

C 使用stdio加载数据时处理不同的体系结构,c,stdio,C,Stdio,我想从文件中读入一些数据。说一个整数: fread(&var1, 4, 1, f); 其中var1是一个整数。但后来我开始思考,这是不安全的,因为不能保证整数的长度是4字节。(为了这个问题,我忽略了其他问题,比如费奥夫和费罗) 我也很快意识到,除了整数大小之外,还有更多的问题,比如系统的终结性,还有一些我甚至没有想到的问题 那么,确保读入的数据得到正确解释的最佳方法是什么?到目前为止,我唯一能想到的就是将数据存储为文本,而不是二进制数据,读入文本,并在运行时进行转换。我想不管解决方案是

我想从文件中读入一些数据。说一个整数:

fread(&var1, 4, 1, f);
其中var1是一个整数。但后来我开始思考,这是不安全的,因为不能保证整数的长度是4字节。(为了这个问题,我忽略了其他问题,比如费奥夫和费罗)

我也很快意识到,除了整数大小之外,还有更多的问题,比如系统的终结性,还有一些我甚至没有想到的问题

那么,确保读入的数据得到正确解释的最佳方法是什么?到目前为止,我唯一能想到的就是将数据存储为文本,而不是二进制数据,读入文本,并在运行时进行转换。我想不管解决方案是什么,如果你想确保它是可移植的,它总是会涉及某种形式的转换


谢谢。

为了避免尺寸问题,您应该执行以下操作:

fread(&var1, sizeof(var1), 1, f);
如果您担心
int
的大小在写入数据的平台和读取数据的平台之间可能有所不同,那么您就有一个更根本的问题。在此场景中,应避免使用
int
short
等,并使用
中定义的类型,例如
int16\u t
uint32\u t

处理循环性问题时,应考虑编写帮助函数,以已知的顺序显式地编写/读取各个字节,例如:

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);
}

以上所有内容仅适用于整数类型。对于浮点类型,没有完美的通用解决方案。

始终使用
sizeof()
运算符获取类型的大小。永远不要依赖硬编码的值

棘手的情况是,如果您打算像这样处理输入,可能您除了支持所有可能的环境之外别无选择。但是,使用“更常见的函数”(如scanf())获取输入会隐式执行基于环境的移植。至于Frad(),我也渴望知道理想的方法来考虑不同的环境。检查提供给您的文件的供应商的文档。它会显示其中存储的二进制格式整数。这就是XML如此流行的原因。@Kerriek,好吧,我制作了这个文件,我知道它们存储的格式(因为是我的计算机制作的),我只是想确保其他人也可以使用这些数据。@Hans,所以你建议将它作为文本阅读,把它转换成二进制数据?