Недавно меня просто сбило с толку тонкое различие между поведением 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 запускается «раньше» при вызове игнорирования?