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)