【发布时间】:2017-03-11 12:33:36
【问题描述】:
当我从流中读取所有数据,但不尝试读取超过其末尾的内容时,流的 EOF 未设置。这就是 C++ 流的工作方式,对吧?这就是它起作用的原因:
#include <sstream>
#include <cassert>
char buf[255];
int main()
{
std::stringstream ss("abcdef");
ss.read(buf, 6);
assert(!ss.eof());
assert(ss.tellg() == 6);
}
但是,如果不是read()ing data I ignore() it,则设置 EOF:
#include <sstream>
#include <cassert>
int main()
{
std::stringstream ss("abcdef");
ss.ignore(6);
assert(!ss.eof()); // <-- FAILS
assert(ss.tellg() == 6); // <-- FAILS
}
这是在 GCC 4.8 和 GCC 主干 (Coliru) 上。
它还有一个不幸的副作用是让tellg() 返回-1(因为这就是tellg() 所做的),这对我正在做的事情来说很烦人。
这是标准规定的吗?如果有,是哪一段,为什么?为什么ignore() 会尝试阅读比我告诉它的更多的内容?
我在cppreference's ignore() page 上找不到这种行为的任何原因。我可能可以.seekg(6, std::ios::cur) 代替,对吧?但我还是想知道发生了什么。
【问题讨论】: