2012-02-24 37 views
2

我有一个文件,我想从中读取并打印到屏幕上。我使用XCode作为我的IDE。这里是我的代码...fread()把奇怪的东西放入char数组

fp=fopen(x, "r"); 
char content[102]; 
fread(content, 1, 100, fp); 
printf("%s\n", content); 

该文件的内容是“培根!”它打印出的是\254\226\325k\254\226\234

我已经搜遍了这个答案,但C中文件I/O的文档似乎很少,而且有一点不太清楚。 (对我来说至少...)

编辑:我切换到只读,不追加和读取,并切换fread()中的两个中间参数。现在它打印出Bacon!\320H\320这些事情是什么意思?东西在反斜杠数字号码或字母。我也转而按照建议打印出来。

+0

什么文件中的内容? – Dani 2012-02-24 15:22:32

+1

永远不要使用从任何地方读取的格式字符串!在这种情况下,使用'puts()'或'printf(“%s”,内容)' – ydroneaud 2012-02-24 15:23:18

+0

@Dani这个问题告诉你它是“培根!”你怀疑培根的力量吗? – CoffeeRain 2012-02-24 15:24:03

回答

9

您正在打开的文件追加和阅读。你应该打开它阅读,或将你的阅读指针移动到你要阅读的地方(我假设的开头)。

FILE *fp = fopen(x, "r"); 

FILE *fp = fopen(x, "a+"); 
rewind(fp); 

此外,fread(...)不零终止您的字符串,所以你应该在打印前终止它:

size_t len = fread(content, 1, 100, fp); 
content[len] = '\0'; 
printf("%s\n", content); 
+0

'“a +”'表示附加_and_阅读。 – 2012-02-24 15:26:42

+0

a +打开阅读和追加(根据我的本地手册页),它应该从一开始就读取文件...(我今天学到了一些东西!) – vmpstr 2012-02-24 15:27:38

+0

@JoachimPileborg好点,我更新了答案以反映这一点。谢谢! – dasblinkenlight 2012-02-24 15:29:49

2

我想,你的意思是这样的:

printf("%s\n", content); 
0

一个可能的原因是,直到它找到一个字符串结束你不终止你读取数据,所以printf打印缓冲区。

1

可能:

fp = fopen(x, "a+"); 
if(fp) 
{ 
    char content[102]; 
    memset(content, 0 , 102); 

    // arguments are swapped. 
    // See : http://www.cplusplus.com/reference/clibrary/cstdio/fread/ 
    // You want to read 1 byte, 100 times 
    fread(content, 1, 100, fp); 

    printf("%s\n", content); 
}