Почему нельзя использовать «get c (f))! = EOF» для прямого сравнения? - PullRequest
0 голосов
/ 13 марта 2020

Я новичок в C языке, и теперь застреваю с таким вопросом: почему я получаю странный результат, если я использую приведенное выше выражение для печати строки в файле?

Вот ситуация: у меня есть файл (data.txt) со следующим содержанием:

«Привет всем !!»

А вот мой код:

int main()
{
   FILE *ptr = fopen("data.txt", "r");

   if (ptr != NULL)
   {
      while (getc(ptr) != EOF)    //print all contents in data.txt
         printf("%c", getc(ptr));
   }
   else
      printf("Open file failed.");

   return 0;
}

Результат выполнения:

"el vroe!"

Если я сначала назначу getc(ptr) переменной и проведу сравнение, все будет хорошо.

В чем разница между этими двумя методами?

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Вы извлекаете первый символ в условии while, а затем извлекаете второй символ в printf. Таким образом, вы печатаете только каждый второй символ в al oop.

Если хотите, сделайте что-то вроде:

int c;

while ((c = getc(ptr)) != EOF) {
printf("%c", c);
}
1 голос
/ 13 марта 2020

Можно, конечно, но вам нужно сохранить прочитанный символ. Если вы этого не сделаете, он будет потерян.

int main()
{
   FILE *ptr = fopen("data.txt", "r");

   if (ptr != NULL)
   {
      int c;
      while ((c = getc(ptr)) != EOF)    //print all contents in data.txt
         printf("%c", c);
   }
   else
      printf("Open file failed.");

   return 0;
}
...