getc和fscanf之间的区别

为什么以下代码工作正常:

#include int main() { FILE *fp=fopen("input.txt","r+"); char c; while((c=getc(fp))!=EOF) { printf("%c",c); } fclose(fp); return 0; } 

但是这段代码给出了错误“分段错误,核心转储”:

 #include int main() { FILE *fp=fopen("input.txt","r+"); char c; while((c=fscanf(fp,"%c",&c))!=EOF) { printf("%c",c); } fclose(fp); return 0; } 

input.txt包含一个以空格分隔的字符列表,如:abcdef

这不会像你期望的那样工作:

 while((c=fscanf(fp,"%c",&c))!=EOF) 

getc()返回读取的字符,可以是EOF ,但fscanf()返回分配的输入项数,如果在发生任何转换之前发生故障,则返回EOF

您不能将此返回值分配给c ,因为返回值不是读取的字符(稍后您尝试打印)。

你应该试试这个:

 while(fscanf(fp,"%c",&c) == 1) 

要么:

 while(fscanf(fp,"%c",&c) != EOF) 

这相当于说“只要有一个字符可读……”

此外,在第一种情况下(使用getc()的代码), c应该是int – 如果目标平台使用无符号字符,则可以有无限循环,因为c将始终转换为正int(同样,仅在具有无符号字符的平台中),因此永远不会等于EOF 。 如果检查getc()putc() (以及处理字符的其他函数putc()的联机帮助页,您将看到它们接收int ,而不是char