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
。