getc和fscanf之间的差异

getc和fscanf之间的差异,c,file-io,scanf,getc,C,File Io,Scanf,Getc,为什么以下代码工作正常: #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; } #包括 int main() { 文件*fp=fopen(“input.txt”,“r+

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

#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;
}
#包括
int main()
{
文件*fp=fopen(“input.txt”,“r+”);
字符c;
而((c=getc(fp))!=EOF)
{
printf(“%c”,c);
}
fclose(fp);
返回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;
}
#包括
int main()
{
文件*fp=fopen(“input.txt”,“r+”);
字符c;
而((c=fscanf(fp、%c、&c))!=EOF)
{
printf(“%c”,c);
}
fclose(fp);
返回0;
}

input.txt包含一个空格分隔的字符列表,如:a b c d e f

这将无法按预期方式工作:

while((c=fscanf(fp,"%c",&c))!=EOF)
getc()
返回读取的字符,该字符可以是
EOF
,但是
fscanf()
返回分配的输入项目数,或者
EOF
(如果在任何转换发生之前出现故障)

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

您应该尝试以下方法:

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

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


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

c
应该是
int
——如果目标平台使用无符号字符,则可以有一个无限循环,由于
c
始终会转换为正
int
(同样,仅在具有无符号字符的平台中),因此永远不会等于
EOF
,因此无法正常工作,但我认为这样做是为了避免造成一个段错误。我不确定目标平台是什么意思,但我在ubuntu上运行这个程序terminal@codeln请参阅可能未打开文件。@dasblinkenlight您完全正确。编辑了我的答案。谢谢,你的答案很有帮助。getc和fscanf之间还有什么我应该记住的区别吗?@codeln好吧,
fscanf()
getc()
强大得多
getc()
逐字符读取,
fscanf()
提供格式化说明符的所有功能。
while(fscanf(fp,"%c",&c) != EOF)