当读取具有较大值的无符号整数时,Fread返回错误的值

问题描述:

当我从二进制文件中读取一个无符号整数时,如果文件中的值相当低,它只会读取正确的值 - 当我尝试读取超过150,000它给了我一些像9000 ...这很奇怪。数字越小,工作完全然而,像50000 ...当读取具有较大值的无符号整数时,Fread返回错误的值

unsigned int value; 

file = fopen(filePath, "rb"); 
fseek(file, 0, 0); 
fread(&value, sizeof(unsigned int), 1, file); 

printf("Value from file: %i\n", value); 

二进制文件,该程序运行在同一台计算机&操作系统上创建的...我缺少什么?二进制文件创建正确,其中大部分确实返回正确的值&工作正常,只有大数字不会...

+0

如果你想格式化IO,为什么不使用'fscanf()'? –

+0

How * was *创建的二进制文件? – StoryTeller

+1

发布文件的十六进制转储。同时检查'fread'的返回值 –

您得到正确的值,但使用了错误的格式字符串来打印它,产生未定义的行为。 %i用于有符号整数。您需要%u

上述确实是一个错误,但如果它不是问题的根源,也可能是您在Windows上使用了遗留编译器,并且编写代码无法以二进制模式打开文件。在这种情况下,如果其中一个字节恰巧为0x0a,则该值可能会损坏,在这种情况下,读回的值将会出错。

+0

尽管使用了错误匹配说明符,但这并不能很好地解释“当我尝试读取超过150,000的值时,它会给我类似9000的东西......这很奇怪,但是小数字完美地工作,但是像50,000 ......”。但我认为这个答案是正确的,OP的问题描述是不对的。 – chux

+0

是的,我在回答这些问题后读到了这些具体的数字,但他们没有意义,但我认为这个问题的描述不够明确,他们可能是假的价值观OP是错误的记忆。我也给答案增加了另一个可能的解释。 –