问题来自于示例代码istream/putback。
#include <sstream>
#include <iostream>
int main()
{
std::istringstream s2("Hello, world"); // input-only stream
s2.get();
if (s2.putback('Y')) // cannot modify input-only buffer
std::cout << s2.rdbuf() << '\n';
else
std::cout << "putback failed\n";
s2.clear();
if (s2.putback('H')) // non-modifying putback
std::cout << s2.rdbuf() << '\n';
else
std::cout << "putback failed\n";
}为什么s2.putback('Y')失败了,但s2.putback('H')成功了?后者不也是一种修改仅输入流缓冲区的操作吗?
另外,我在做一些实验的时候发现了一些令人困惑的东西。与上面的示例相比,我添加了1行代码,第二个结果失败了。为什么会这样呢?
#include <sstream>
#include <iostream>
int main()
{
std::istringstream s2("Hello, world"); // input-only stream
s2.get();
if (s2.putback('Y')) // cannot modify input-only buffer
std::cout << s2.rdbuf() << '\n';
else
std::cout << "putback failed\n";
std::cout << s2.rdbuf() << '\n'; //1 line code added
s2.clear();
if (s2.putback('H')) // non-modifying putback
std::cout << s2.rdbuf() << '\n';
else
std::cout << "putback failed\n";
}发布于 2018-09-17 07:30:03
您可以进一步阅读sputbackc的行为。
如果在get区域(
gptr() > eback())中有一个备用位置,并且字符c等于gptr()左侧的一个位置(由Traits::eq(c, gptr()[-1])确定),那么只需减少下一个指针(gptr())。
因此,在s2.putback('H')的情况下,只有下一个指针会减少。缓冲区没有更改。
回答您的编辑:basic_ostream& operator<<( std::basic_streambuf* sb);提取sb维护的字符,因此在std::cout << s2.rdbuf() << '\n';之后,下一个指针指向缓冲区的末尾,这将导致s2.putback('H')失败。
发布于 2018-09-17 07:09:59
为什么
s2.putback('Y')失败了,但s2.putback('H')成功了?后者不也是一种修改仅输入流缓冲区的操作吗?
调用s2.putback('H')可能会修改缓冲区,但在本例中不会修改,因为数据已经以'H'开头。
你可以举例说明这样的行为:
s2.clear();
assert(s2.putback('H')); // Ok, replacing 'H' with 'H' doesn't change anything
assert(!s2.putback('Z')); // Can't modify.https://stackoverflow.com/questions/52362361
复制相似问题