2016-09-18 86 views
0

我已经写以下C代码来从输入文件中读取5点的整数的整数:错误而读取下使用的fread

#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 

但输出I我得到的是:

540155953 
540287027 
14389 
0 
0 

请帮我。

+3

您对数据存储方式存在根本的误解。你有一个文本文件。这意味着数据以ascii字符形式存储。所以你不能把它们看成整数。 – kaylum

+2

作为文本阅读。例如(fp,“%u”,&ch [i]);' – BLUEPIXY

+0

是不是可以使用fread函数读取整数/双精度变量文本文件? – noirritchandra

回答

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

+0

这只是一个骗局。请不要回答重复或需要结束的问题。 –

+0

@AshishAhujaツ你是否赞成这个答案? – 2501

+0

@ 2501是的,我做到了。 –