Как использовать 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 ответа:
Я бы изменил ваш цикл и логику, чтобы использовать это:
while (fgets(pcompanyRow, 1024, f) != NULL) { /* do things */ }
Когда fgets() пытается прочитать конец файла, он возвращает NULL, и вы выходите из цикла. Вы все еще можете продолжать использовать
pass
и другие флаги/логику, но условия, которые вы проверяете, будут немного отличаться.
Вы никогда не должны использовать feof() в качестве индикатора выхода для цикла. feof() имеет значение TRUE только после чтения конца файла (EOF), а не при достижении EOF
Источник здесь. Он также подробно объясняет проблему и способы ее устранения.