为什么以下代码可以正常工作:
#include<stdio.h>
int main()
{
FILE *fp=fopen("input.txt","r+");
char c;
while((c=getc(fp))!=EOF)
{
printf("%c",c);
}
fclose(fp);
return 0;
}
但是这段代码给出了错误“分段错误,核心转储”:
#include<stdio.h>
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包含一个空格分隔的字符列表,如:a b c d e f
答案 0 :(得分:3)
这不会按照你期望的方式运作:
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 - 如果目标平台使用无符号字符,则可以有无限循环,因为{{1}将始终转换为正int(同样,仅在具有无符号字符的平台中),因此永远不会等于c
。如果您查看EOF
和getc()
(以及与角色有关的其他功能)的联机帮助页,您会看到他们收到putc()
,而不是int
。