Вопрос по stl, c++, ifstream – Если поток поиска за пределами конца не возвращает eof в VS 2008 Express?

1

В VS 2005 у меня есть код, который выглядит следующим образом:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    loc = ifs.tellg();
    loc += bar.dwHeaderSize;
    // four byte boundary padding
    if ((loc % 4) != 0)
        loc += 4 - (loc % 4);
    ifs.seekg(loc,ios::beg);
}
ifs.close();

Код работал нормально в VS 2005, но не работает в VS 2008 Express. Из того, что я могу сказать, VS 2008 не возвращает eof () после поиска кода в конце файла. Я что-то пропустил? Я исправил это, добавив явную проверку, чтобы увидеть, превышает ли место поиска размер файла, но я хочу убедиться, что я правильно понимаю ifstream.

Ваш Ответ

1   ответ
2

как вы попытаетесь прочитать после конца файла.
Читающийupto конец файла не сработает.

Вот почему большая часть кода выглядит следующим образом:

while(ifs.read(&bar,sizeof(bar)))
{
     // Do Stuff
}

Если результат read () переместится в EOF, цикл будет введен.
Если результат read () пройдет EOF, цикл НЕ будет введен

ПРИМЕЧАНИЕ: read () будет проходить только после EOF, если в файле остались нулевые байты. В противном случае он будет читать до конца файла. Так что цикл всегда вводится, если в файле что-то осталось.

Причина - результат чтения (возвращаемое значение) - ссылка на поток. Если поток используется в логическом контексте (например, в тестовом выражении if), он преобразуется в тип, который можно использовать в таком контексте. Результат этого преобразования проверяет флаг EOF (в дополнение к нескольким другим) и возвращает эквивалент false, если EOF равен true.

Заметка
Эти методы работают лучше, если вы перегрузите оператор << для вашего класса Bar, так как он должен читать именно то, что ему нужно для объекта, не выходя за пределы EOF. Тогда легче сделать ваши объекты прочитанными точно до конца файла, не переходя. При чтении я беспокоюсь о том, что должно произойти, если read () хочет 10 байтов, а в файле всего 5 байтов, что происходит с частично заполненным объектом?

Если вы хотите продолжать использовать свой стиль, код должен выглядеть следующим образом:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    if (ifs.eof())
    {    break;
    }
    // Do Stuff
}

Похожие вопросы