我试图通过使用以下代码编写一个程序来计算文件中的行数。
#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()在这里不起作用。
我们非常感谢所有帮助。
答案 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 glibc和musl-libc都是。您可以研究他们的源代码。这样您将学到很多东西。两者都是在Linux syscalls(2)之上构建的。