考虑以下事项:
char c;
cin >> c;
cin.unget();
假设char输入成功,unget能够保证至少可以回退一个字符吗?如果我请求并成功获取一个字符串,那么我可以保证被允许调用unget一直回退到该字符串的开头吗?
考虑以下事项:
char c;
cin >> c;
cin.unget();
假设char输入成功,unget能够保证至少可以回退一个字符吗?如果我请求并成功获取一个字符串,那么我可以保证被允许调用unget一直回退到该字符串的开头吗?
unget
方法至少回退一个字符。如果要回退多个字符,仅取决于实现和情况,所以不应该假设可以回退多个字符。int unget(int ch, FILE *stream)
。 标准规定如下:ungetc
函数太多次,而没有介入读取或定位操作,则该操作可能失败。basic_istream<>& unget()
的确切说法。basic_istream<>& unget()
的说明(我添加的加粗):!good()
调用setstate(failbit)
,它可能会引发异常,并返回。如果rdbuf()
不为null,则调用rdbuf() - & gt; sungetc()
。如果rdbuf()
为null或如果sungetc()
返回traits :: eof()
,则调用setstate(badbit)
(这可能会抛出ios_base :: failure
(27.4.4.3))。sungetc()
,所以让我们看看标准对此的说明:pbackfail()
。否则,将输入序列的下一个指针减量,并返回traits :: to_int_type(* gptr())
。
uflow()
和underflow()
的要求,您可以推断出,如果streambuf
曾经提供一个字符,则至少会有一个字符的回退缓冲区。uflow()
总是将一个字符从挂起序列转移到备份序列,这意味着在任何成功的sbumpc()
之后必须至少有一个字符的备份。(如果您只执行了sgetc()
,那么这实际上是一个“窥视”,因此您可能没有任何回退空间。) - CB Bailey