繁体   English   中英

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

[英]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 再次阅读它的文档。 很可能fgetcfscanf快得多(因为更底层)。 fscanf大多数实现都使用fgetc (或其等价物)。

最后,一些C 标准库实现免费软件 在 Linux 上,GNU glibcmusl-libc都是。 你可以研究他们的源代码。 这样做你会学到很多东西。 两者都构建在 Linux syscalls(2)之上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM