unget有什么保证吗?

时间:2011-05-27 13:31:54

标签: c++

考虑以下因素:

char c;
cin >> c;
cin.unget();

假设char输入成功,是否保证能够备份至少一个字符?如果我要求,并成功获得一个字符串,我可以保证被允许一直调用unget到该字符串的开头吗?

2 个答案:

答案 0 :(得分:7)

您可以保证unget至少有1个字符。任何不止一个都取决于实施和环境,因此您不应该假设您可以unget多个。

编辑:抱歉,我在想libc的int unget(int ch, FILE *stream)。标准说的是:

  

后退的一个特点是   保证。如果ungetc函数是   在同一个问题上打了太多次   流无需介入读取或   文件定位操作就可以了   流,操作可能会失败。

我会看看我是否能找到关于basic_istream<>& unget()

的确切内容

编辑:好的,所以这是c ++标准中关于basic_istream<>& unget()的说法(由我添加的粗体):

  

表现为无格式输入   功能(如27.6.1.3所述,   第1段)。建成后   如果sentry调用,则为!good()个对象   setstate(failbit)可能会抛出一个   例外,并返回。如果是rdbuf()   不是空,来电rdbuf()->sungetc() 。如果   rdbuf()为空,或sungetc()   返回traits::eof(),来电   setstate(badbit)(可能会抛出   ios_base::failure(27.4.4.3))。

所以重要的是它调用了sungetc(),所以让我们看看标准对此的看法:

  

如果输入序列回放位置   不可用,返回pbackfail()。   否则,递减下一个指针   输入序列和返回   traits::to_int_type(*gptr())

我没有看到任何明确说明限制的内容,所以值得一试。如果我理解正确,它将调整后备流缓冲区中的指针。因此,只要缓冲区中有足够的“历史记录”,就应该继续成功。

然而,与C不同,您似乎永远无法保证它会起作用,但您可能会回放多个角色。

所以我的建议是不要依赖于多个角色,并且总是检查失败。

答案 1 :(得分:0)

您应该考虑改用std::istream::peek

它允许您检查下一个可用字符而不实际将其从流中取出。这样你就不必把它放回去了:)