У меня есть программа C ++, которая читает из файла, который, как я ожидаю, будет иметь кучу одинаково отформатированных записей.Я хочу прекратить чтение, если я столкнулся с чем-то неожиданным, означает ли это плохо отформатированную запись или какой-то сбой ввода, и я хочу провести различие между этими различными условиями.
Я видел этот ответ и посмотрел документацию fscanf()
, и я не уверен, что fscanf()
может указывать на ошибку или EOF без возврата EOF.Из моего понимания обеих этих ссылок возможно, что произойдет ошибка или EOF, даже если fscanf()
вернет значение 0 или больше, поэтому мне придется вызывать ferror()
и feof()
независимо от того, какое значение возвращает fscanf()
.Кажется, я не могу понять, как возвращаемое значение EOF может быть полезным для вызывающей стороны.
Скажем, я ожидаю, что в моем файле будет несколько записей с 4 значениями.Будет ли приведенный ниже код корректно обрабатывать любой конец файла и вводить ошибки?
int ret;
int field1;
int field2;
int field3;
int field4;
while ((ret = fscanf(pFile, "%d %d %d %d", &field1, &field2, &field3,
&field4)) == 4) {
// do whatever with fields
}
if (ferror(fp)) {
// some input error occurred
} else if (feof(fp)) {
// end of file occurred
} else {
assert(ret != EOF);
// encountered record that didn't match expected format
}
Обновление: поэтому я собираюсь добавить документацию из cppreference , потому что она, кажется, немного отличается вописание того, какое условие больше не вызывает возврат EOF.