首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改和不修改putback()的区别

修改和不修改putback()的区别
EN

Stack Overflow用户
提问于 2018-09-17 07:02:03
回答 2查看 142关注 0票数 4

问题来自于示例代码istream/putback

代码语言:javascript
复制
#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行代码,第二个结果失败了。为什么会这样呢?

代码语言:javascript
复制
#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";

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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')失败。

票数 3
EN

Stack Overflow用户

发布于 2018-09-17 07:09:59

为什么s2.putback('Y')失败了,但s2.putback('H')成功了?后者不也是一种修改仅输入流缓冲区的操作吗?

调用s2.putback('H')可能会修改缓冲区,但在本例中不会修改,因为数据已经以'H'开头。

你可以举例说明这样的行为:

代码语言:javascript
复制
s2.clear();

assert(s2.putback('H')); // Ok, replacing 'H' with 'H' doesn't change anything
assert(!s2.putback('Z')); // Can't modify.
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52362361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档