2

我有内容为的文本文件:

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

我得到了结果:

在此处输入图像描述

我无法解释自己为什么会得到这样的结果。

4

3 回答 3

5

您有一个文本文件,但 fread 读取二进制数据。因此,您存储的是文件中的字节而不是文件的文本。尝试使用 fread 来填充您未使用的buffer变量,您应该能够获得文本字符串,然后您可以使用例如 sscanf() 对其进行解析。或者您可以停止使用 fread 并改用 fscanf 。

于 2012-04-21T13:40:15.553 回答
5

那是正确的结果。您正在将数据读取为二进制数据,而不是文本或整数。前四个字节是 0x31323334,在 Intel 机器上读取时会翻转为 0x34333231,即十进制的 875770417。

于 2012-04-21T13:40:27.100 回答
4

文本文件与二进制文件

fread您在应该用于二进制文件的文本文件上滥用该函数。文本文件与二进制文件不同。

比方说,如果你用四个ASCII 字符 "1", "2", "3",保存 txt "4",那么实际存储在磁盘上的不是1, 2, 3, 4。相反,它是他们的 ACSII 代码:49, 50, 51, 52。因此,当您将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

(请注意,地址只是为了说明而伪造的)

字节序

至于这四个字节如何转成整数,都和字节序有关。简而言之,如果您的平台是 little-endian(例如 Intel x86 处理器),00110001则最低内存地址 () 上的第一个字节 ( 0x12345678) 将是构成整数的最低有效字节。

最终,整数是00110100001100110011001000110001二进制的,也就是875770417十进制的。

于 2012-04-21T14:08:06.040 回答