我的文本文件的内容为:

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函数。 text filebinary file不同。

假设,如果您使用四个ASCII characters "1""2""3""4"保存txt,则磁盘上实际存储的不是1234。而是它们的ACSII代码:49505152
因此,当您将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有关。简而言之,如果您的平台是little-endian(例如Intel x86处理器),则最低内存地址(00110001)上的第一个字节(0x12345678)将是形成整数的最低有效字节。

最终,整数是二进制的00110100001100110011001000110001,即十进制的875770417

关于c - C语言中的fread如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10259344/

10-13 21:50