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

问题描述 投票:-2回答:1

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

#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()在这里不起作用。

所有帮助都非常感谢。

c file scanf
1个回答
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上。

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

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

这可以通过使用fgetc()来实现

是的,在你的情况下,你最好使用fgetc。再次阅读其文档。 fgetc很可能比fscanf更快(因为更低级别)。 fscanf的大多数实现都使用fgetc(或其等价物)。

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

© www.soinside.com 2019 - 2024. All rights reserved.