Как использовать feof (FILE *f)?


У меня возникли трудности с циклом 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));

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

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

2 2

2 ответа:

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

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

    /* do things */

}

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

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

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