Почему я не могу использовать fscanf () для чтения последовательных символов из файла? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь написать программу для подсчета количества строк в файле, используя следующий код ..

#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 голосов
/ 24 февраля 2019

Вы забыли проверить счетчик результатов fscanf .В частности, ваша программа совершенно не права, когда обработанный файл пустой.

while(c!=EOF)

Это может никогда не произойти (после любого fscanf(in,"%c",&c) ...).EOF является , а не допустимым символом (поэтому по определению находится за пределами всех возможных значений char).Например, в вашей системе char может быть 8-разрядным без знака, а EOF может быть равно -1 (EOF задокументировано в §7.21.1 стандарта C11 - быть отрицательным 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) .

...