getc和fscanf之间的区别

时间:2014-02-08 12:16:14

标签: 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;
}

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

#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

1 个答案:

答案 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。如果您查看EOFgetc()(以及与角色有关的其他功能)的联机帮助页,您会看到他们收到putc(),而不是int