Как использовать FEOF (файл *f)?
-
29-09-2019 - |
Вопрос
Мне трудно с помощью петли 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