Вопрос

Мне трудно с помощью петли Do-While, которое предполагается остановиться, когда мы достигаем конца файла. Вот код петли:

do  {
    if (pcompanyRow[0] != '#' && pass == 1) {
        strtok(pcompanyRow, ":");
        pcompanyName = strcpy(pcompanyName, strtok(NULL, ""));
        pass = 2;
        fgets(pcompanyRow, 1024, f);
    }
    if (pcompanyRow[0] != '#' && pass == 2) {
        strtok(pcompanyRow, ":");
        pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , ""));
        pass = 3;
        fgets(pcompanyRow, 1024 , f);
    }
    if (pcompanyRow[0] != '#' && pass == 3) {
        strtok(pcompanyRow, ":");
        pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, ""));
        pass = 4;
        fgets(pcompanyRow, 1024, f);
    }
    if (pass == 4)  {
        AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice);
        pass = 1;
    }
} while (!feof(f));

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

Как я должен написать это правильно?

Это было полезно?

Решение

Я бы изменил свой петлю и логику, чтобы использовать это:

while (fgets(pcompanyRow, 1024, f) != NULL) {

    /* do things */

}

Когда FGES () пытаются прочитать через конец файла, он вернет нуль, и вы выберете из цикла. Вы все еще можете продолжать использовать pass и другие ваши флаги/логика, но условия, которые вы проверяете, будут немного разными.

Другие советы

Вы никогда не должны использовать Feof () в качестве индикатора выхода для петли. feof () верно только после окончания файла (EOF), а не при достижении EOF

Источник здесь. Отказ Это также подробно объясняет проблему и как это исправить.

Я предлагаю использовать как fgets (), так и feof (). Последняя строка в файле может иметь n или не может. Если вы используете только Feof (), вы можете пропустить (потерянную) последнюю строку.

 for(;;)
 {char *pc;

  pc=fgets(buf,sizeof(buf),fd);

  if(!pc)
    {//it may be read error or end of file
      if(feof(fd))
        {//it is end of file, normal exit from for
         break;      
        }
       else
        {//it is i/o error 
         fclose(fd);
         return 2;
        }
    }
}//for
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top