在C中使用fread读取整数时出错

时间:2016-09-18 06:14:58

标签: c integer output fread

我编写了以下C代码,用于从输入文件中读取5个整数:

#include<stdio.h>
#include<stdlib.h>
int main(){
  FILE *fp;
  unsigned *ch;
  unsigned i,n=5;

  ch=(unsigned*)malloc(n*sizeof(unsigned));
  fp=fopen("input","r");
  fread(ch ,sizeof(unsigned),n,fp);
  fclose(fp);
  for(i=0;i<n;i++)
    printf("\n%u ",ch[i]);
  free(ch);  
  return 0;
}

输入文件是:

1 2 3 4 58

但我得到的输出是:

540155953 
540287027 
14389 
0 
0

请帮帮我。

1 个答案:

答案 0 :(得分:1)

fread和fwrite用于二进制文件。二进制文件中的数据被解释为它们在内存中出现的字节,而不是人类可以读取的文本文件。在linux上使用hexdump命令,我们可以看到输入文件的十六进制值

$ hexdump -C input
00000000  31 20 32 20 33 20 34 20  35 38 0a         

使用ASCII table的十六进制列,可以看到0x31是1个字符,0x20是空格字符等。但是因为fread将文件中的数据解释为二进制,所以将为每个unsigned int读取4个字节。您可以检查0x20322031(文件中的前4个字节的顺序是否相反)等于540155953.

如果要以二进制文件生成文件中的数据并随后将其读取,则可以使用

#include<stdio.h>
#include<stdlib.h>
int main(){
  FILE *fp;
  unsigned *ch;
  unsigned i,n=5;

  unsigned int arr[] = {1,2,3,4,58};

  ch=(unsigned*)malloc(n*sizeof(unsigned));
  fp=fopen("input","w+");
  fwrite(arr,sizeof(unsigned),n,fp); /* write binary */
  fseek(fp, SEEK_SET, 0); /* move file cursor back to the start of the file */
  fread(ch ,sizeof(unsigned),n,fp); /* read binary */
  fclose(fp);
  for(i=0;i<n;i++)
    printf("\n%u ",ch[i]);
  free(ch);  
  return 0;
}

并检查名为input的文件以查看差异。

如评论中所述,如果您想将数据解释为文本文件,则可fscanf使用%u说明符来获取unsigned int