多次在istream上调用putback()

Izh*_*ido 6 c++ istream

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

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

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

这是真的吗?如何才能知道我有多少个字符可以补篮()为istream对象?

mr_*_*ner 4

如果您想从流中读取多个字符,您可以使用以下方法获取它们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;
}
Run Code Online (Sandbox Code Playgroud)

该函数在函数退出后从流中读取前 5 个字符,而这些字符仍在流中。