![](/img/trans.png)
[英]If I use fscanf to read a file, can I use it to store the number of characters it reads?
[英]Why can I not use fscanf() to read consecutive characters from a file?
我正在尝试使用以下代码编写一个程序来计算文件中的行数..
#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() 在这里不起作用。
非常感谢所有帮助。
您忘记测试fscanf的结果计数。 特别是,当处理的文件是空文件时,您的程序完全错误。
while(c!=EOF)
这永远不会发生(在任何fscanf(in,"%c",&c)
... 之后)。 EOF
不是有效字符(因此根据定义,它超出了char
的所有可能值)。 例如,在您的系统上, char
可能是 8 位无符号,而EOF
可能是 -1( EOF
被记录在 -在 C11 标准的第 7.21.1 节中- 是一些负的int
,而不是一些char
)。 所以EOF
的类型不是char
。 在我的 Linux/Debian/x86-64 上,这种情况正在发生。
更仔细地阅读与<stdio.h>
相关的文档
通常,请阅读您正在使用的每个函数的文档。 并学习如何调试小程序
这可以通过使用 fgetc() 来实现
是的,在您的情况下,您最好使用fgetc 。 再次阅读它的文档。 很可能fgetc
比fscanf
快得多(因为更底层)。 fscanf
大多数实现都使用fgetc
(或其等价物)。
最后,一些C 标准库实现是免费软件。 在 Linux 上,GNU glibc和musl-libc都是。 你可以研究他们的源代码。 这样做你会学到很多东西。 两者都构建在 Linux syscalls(2)之上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.