2015-02-09 32 views
0

我不明白为什么这个小C代码不起作用FREAD()函数给出了垃圾

#include <stdio.h> 

main(int argc,char **argv){ 
    FILE *fp, 
    int i; 
    size_t elem_read; 
    int buffer[100]; 
    fp=fopen(argv[1],"r"); 
    elem_read=fread(buffer,sizeof(int),100,fp); 
    for(i=0;i<elem_read;i++) 
      fprintf(stderr,"%d\t",buffer[i]); 
    fclose(fp); 
} 

为了缩短我没有做任何错误检查的代码,但它应该工作...我已经用txt和bin文件试着读取数字并将其打印出来。我想我明白为什么这不适用于txt文件,但我不明白为什么它不与.bin文件?我有一个包含4个整数的文件:10 10 10 10,但是当我尝试使用./a.out file.bin运行它时,我得到一些随机数字(垃圾输出),问题在哪里?

+0

该文件的内容是什么? – 2015-02-09 18:05:27

+0

@iharob 10 10 10 10 – BsD 2015-02-09 18:06:01

+0

Text? '10 10 10 10'? – 2015-02-09 18:06:50

回答

6

它不与.bin文件工作的原因是,如果你可以在你的文本编辑器中看到10 10 10 10,你已经有了一个.bin扩展名的文件。但是,您读取的值不是“垃圾”,它们是代表文件编码中文本的字节,重新解释为整数。

为了读取数字早在int s,写入写入二进制数到一个文件,这样

FILE *fp = fopen("test", "wb"); 
int[] data = {10, 10, 10, 10}; 
fwrite(data, sizeof(int), sizeof(data)/sizeof(int), fp); 
fclose(fp); 

程序,然后使用你的程序来阅读。

+0

@Jongware你是对的,谢谢! – dasblinkenlight 2015-02-09 18:16:49

+0

有趣...它虽然工作,谢谢! – BsD 2015-02-09 18:22:49

+2

**重要注意事项:**当访问(读取,写入或同时使用二进制文件)时,请在模式中添加“b”(即使用“rb”或“wb”),否则数据可能会损坏。这是因为只有“r”可能(例如---实际取决于OS)将CRLF(源中的“0D”,“0A”)转换为LF(“0A”)---换句话说, 。在旧的Mac OS系统中,它会将CR转换为LF('0D'->'0A')。在处理文本文件时,我总是以二进制模式自己读取,并手动处理可能的行尾;如果用户给你的文件提供了不正确的(甚至是混合的)行结尾,那么就不会出错。 – 2015-02-09 18:27:11