考虑以下因素:
char c;
cin >> c;
cin.unget();
假设char输入成功,是否保证能够备份至少一个字符?如果我要求,并成功获得一个字符串,我可以保证被允许一直调用unget到该字符串的开头吗?
答案 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
。
它允许您检查下一个可用字符而不实际将其从流中取出。这样你就不必把它放回去了:)