c++ - 多次调用 istream 上的 putback()

标签 c++ istream

许多站点都描述了 istream::putback() 函数,它可以让您将一个字符“放回”输入流中,以便您可以在后续的读取操作中再次读取它。

然而,是什么阻止我在同一个流上按顺序多次调用 putback()?当然,您应该在每次操作后检查错误,以确定它是否成功;然而,我想知道:是否可以保证特定类型的流支持一次放回多个字符?

我只是在这里猜测,但我可以想象 istringstream 能够放回与流中字符串长度一样多的字符;但我不确定 ifstream 是否相同。

这是真的吗?我如何知道可以将多少个字符putback() 放入istream

最佳答案

如果你想从流中读取多个字符,你可以使用 unget() 取消获取它们:

std::vector<char>&read_top5(std::istream & stream, std::vector<char> & container) {
    std::ios_base::sync_with_stdio(false);
    char c;
    int i=4;
    container.clear();

    while (stream && stream.get(c)) {
        container.push_back(c);
        if (--i < 0) break;
        if (c == '\n') break;
    }

    for (int j=0;j<(int)container.size();j++) {
        //stream.putback(container[j]); // not working
        stream.unget(); // working properly
    }

    return container;
}

此函数在函数退出后从流中读取前 5 个字符,而它们仍在流中。

关于c++ - 多次调用 istream 上的 putback(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36213693/

相关文章:

c++ - 将 C++ 代码拆分为多个翻译单元是否会增加可执行文件大小的开销?

c++ - pthread 和 semaphore 在 osx maverick 10.9 中不适用于我

c++ - istream::read 和每个样本的 wav 格式位

C++ While( cin >> x) 是如何工作的?

C++ 流混淆 : istreambuf_iterator vs istream_iterator?

c++ - 编译时在文件中包含字符串

c++ - 通过 Rust 中的泛型类型进行编译时算术,类似于 C++?

c++ - 从二进制文件读取时获取错误数据

c++ - 如何为邻接列表读取格式化文件?

c++ - FindFirstFile 不适用于通配符