如何在C中使用fread?
我的文本文件包含以下内容:
12345678901222344567
然后我用这段代码来阅读内容:
FILE * pFile; int c; char buffer [256]; pFile = fopen ("myfile.txt","r"); int a[50] = {0}; fread(a, sizeof(a[0]), 5, pFile); fclose(pFile); for (c = 0; c < 5; c++) { printf("%d\n", a[c]); }
我得到了结果:
我无法解释自己为什么会得到这样的结果。
文本文件与二进制文件
你在一个应该在二进制文件上使用的文本文件上滥用fread
函数。 文本文件与二进制文件不同。
比方说,如果你用四个ASCII字符 "1"
, "2"
, "3"
, "4"
保存txt,那么实际存储在磁盘上的不是4
。 相反,它是他们的ACSII代码: 49
。 因此,当您将sizeof(a[0])
字节读入a[0]
,会在内存中读回四个字节,如:
Memory Address Byte In Memory Little-endian 0x12345678 00110001 <----least significant byte 0x12345679 00110010 0x12345680 00110011 0x12345681 00110100 <----most significant byte
(注意地址只是为了说明而伪造)
字节序
至于如何将这四个字节转换为整数,这一切都与Endianness有关 。 简而言之,如果您的平台是小端(例如,Intel x86处理器),则最低内存地址( 0x12345678
)上的第一个字节( 00110001
)将是形成整数的最低有效字节。
最终,整数是二进制的875770417
,即十进制的875770417
。
你有一个文本文件,但是fread读取二进制数据。 所以你要存储文件中的字节而不是文件的文本。 尝试使用fread来填充未使用的buffer
变量,您应该能够获得文本字符串,然后使用例如sscanf()进行解析。 或者你可以停止使用fread并使用fscanf代替。
这是正确的结果。 您正在将数据读取为二进制数据,而不是文本或整数。 前四个字节是0x31323334,在Intel机器上读取时会翻转到0x34333231,即十进制的875770417。