Различное поведение EOF при чтении и игнорировании

Недавно меня просто сбило с толку тонкое различие между поведением std :: istream :: read и ] std :: istream :: ignore . По сути, read извлекает N байтов из входного потока и сохраняет их в буфере. Функция ignore извлекает N байтов из входного потока, но просто отбрасывает их, а не сохраняет в буфере. Итак, я понял, что read и ignore в основном одинаковы во всех отношениях, за исключением того факта, что read сохраняет извлеченные байты, а игнорирует просто отбрасывает их.

Но есть еще одна тонкая разница между читать и игнорировать , которая смогла меня сбить с толку. Если вы прочитаете до конца потока, условие EOF не сработает. Вы должны прочитать после конца потока, чтобы сработало условие EOF. Но с игнорированием все по-другому: вам нужно читать только до конца потока.

Учтите:

#include <sstream>
#include <iostream>
using namespace std;

int main()
{
    {
        std::stringstream ss;
        ss << "abcd";
        char buf[1024];
        ss.read(buf, 4);
        std::cout << "EOF: " << std::boolalpha << ss.eof() << std::endl;
    }

    {
        std::stringstream ss;
        ss << "abcd";
        ss.ignore(4);
        std::cout << "EOF: " << std::boolalpha << ss.eof() << std::endl;
    }
}

В GCC 4.4.5 это распечатывает:

EOF: false
EOF: true

Итак, почему поведение здесь другое? Эта тонкая разница смутила меня настолько, что я задался вопросом, почему она есть. Есть ли какая-то веская причина того, что EOF запускается «раньше» при вызове игнорирования?

5
задан Lightness Races with Monica 9 July 2011 в 22:13
поделиться