EOF перед EOF в Visual Studio - PullRequest
       11

EOF перед EOF в Visual Studio

0 голосов
/ 02 сентября 2011

У меня был этот фрагмент в программе (в Visual Studio 2005):

if(_eof(fp->_file))
{
    break;
}

Он разорвал замкнутый цикл при достижении eof.Но программа не смогла проанализировать последние несколько тысяч символов в файле.Итак, чтобы выяснить, что происходит, я сделал следующее:

if(_eof(fp->_file))
{
    cout<<ftell(fp)<<endl;
    break;
}

Теперь ответ, который я получил от ftell, отличался (и меньше) от фактического размера файла (который не ожидается)).Я думал, что Windows может иметь некоторые проблемы с файлом, затем я сделал это:

if(_eof(fp->_file))
{
    cout<<ftell(fp)<<endl;
    fseek(fp, 0 , SEEK_END);
    cout<<ftell(fp)<<endl;
    break;
}

Ну, fseek () дал правильный ответ (равный размеру файла) и начальный ftell ()не удалось (как было сказано ранее).

Есть идеи о том, что здесь может быть не так?

РЕДАКТИРОВАТЬ: Файл открыт в режиме "rb".

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Вы не можете надежно использовать _eof() в дескрипторе файла, полученном из FILE*, поскольку потоки FILE* буферизуются. Это означает, что fp высосал fp->_file всухую и сохраняет оставшийся байт во внутреннем буфере. В конечном итоге fp->_file находится в позиции eof, тогда как fp все еще имеет байты для чтения. Используйте feof() после операции чтения, чтобы определить, находитесь ли вы в конце файла, и будьте осторожны, если вы смешиваете функции, которые работают на FILE*, с функциями, работающими с целочисленными файловыми дескрипторами.

1 голос
/ 02 сентября 2011

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

В этом случае ftell (fp) сообщает о состоянии потока, и вы должны использовать feof (fp), чтобы сохранить их в том же домене ввода / вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...