如何在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。