为什么不能使用fscanf()从文件中读取连续的字符?

时间:2019-02-24 05:19:17

标签: c file scanf

我试图通过使用以下代码编写一个程序来计算文件中的行数。

#include <stdio.h>

int main(int argc,char *argv[])
{
if(argc!=2)
{
  printf("invalid no. of arguments\nUsage:lc <FILENAME>\n");
  return 1;
}


FILE *in=fopen(argv[1],"r");

char c;
int count=0;
fscanf(in,"%c",&c); //take the first character

while(c!=EOF)
{
  if(c=='\n')
   count++;
   fscanf(in,"%c",&c);
}
fclose(in);

printf("TOTAL LINES:%d\n",count);
return 0;
}

我知道可以通过使用fgetc()来实现,但是我很好奇为什么fscanf()在这里不起作用。

我们非常感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

您忘记测试fscanf的结果计数。尤其是当处理的文件为空文件时,您的程序是完全错误的。

while(c!=EOF)

(永远不会发生)(在任何fscanf(in,"%c",&c)之后)。 EOF 不是有效字符(因此,根据定义,它不在char的所有可能值之内)。例如,在您的系统上,char可以是无符号的8位,而EOF可以是-1(EOF记录在§7.21.1 of the C11 standard中-设为负数int,而不是某些char)。因此EOF的类型不是char。在我的Linux / Debian / x86-64上,这种情况正在发生。

仔细阅读与<stdio.h>相关的documentation

通常,请阅读所使用的每个功能的文档。并学习How to debug small programs

  

这可以通过使用fgetc()

来实现

是的,您最好使用fgetc。再次,阅读其文档。 fgetc很有可能比fscanf快得多(因为它的底层级别更高)。 fscanf的大多数实现都在使用fgetc(或其等效项)。

最后,一些C standard library 实现free software。在Linux上,GNU glibcmusl-libc都是。您可以研究他们的源代码。这样您将学到很多东西。两者都是在Linux syscalls(2)之上构建的。