内陆()和乌格()之间的区别

时间:2011-07-20 22:43:21

标签: c++

我正在使用标准iostream从文件中获取一些输入,我对unget()putback(character)感到困惑。从文档中可以看出,这些函数实际上是相同的,unget()只记得放入的字符,所以我很紧张。我一直使用putback(character),但character始终是最后读取的字符,我一直在考虑更改为unget()putback(character)始终与unget()完全相同,如果character始终是最后读取的字符吗?

2 个答案:

答案 0 :(得分:16)

你不能与unget()撒谎。它“取消”最后读取的字符。你可以骗putback(c)。您可以“回放”除最后读取的字符之外的某些字符。有时候放回一个字符而不是最后读取的字符可能很有用。

此外,如果底层读缓冲区确实具有缓冲功能,则可以“回放”多个字符。我认为ungetc()仅限于一个角色。

修改
不。看起来unget()可以追溯到putback()

答案 1 :(得分:3)

这不是你可能期望的答案,但想要介绍我的推理。文档保留方法putbackunget分别调用streambuf::sputbackcstreambuf::sungetc。定义如下:

  
    

<强>流缓冲:: sungetc

         

将get指针向后移动一个字符,使得输入操作获得的最后一个字符再次可用于下一个输入操作。

         

在操作期间,如果get指针gptr指向与开始指针eback相同的位置,该函数将调用受保护的虚拟成员函数pbackfail。

  

另一个:

  
    

<强>流缓冲:: sputbackc

         

将get指针移回指向其当前位置之前的字符,以便最后获得的字符c再次可用作下一个输入操作在该位置读取的字符。

         

在操作期间,如果字符c与gptr()[ - 1]不匹配,或者get指针gptr指向与开始指针eback相同的位置,则该函数调用受保护的虚拟成员函数pbackfail。 / p>          

当c与该位置的字符不匹配时,streambuf中pbackfail的默认定义会将c前置为在该位置提取的字符(如果可能),但派生类可能会覆盖此行为。

         

成员函数sungetc的行为方式与此类似,但不带任何参数

  

如果sputbackc调用pbackfail,如果字符不匹配,则表示该方法必须检查值是否相等。看起来额外的检查是唯一的开销,但不知道它是如何在实践中解决的。我可以想象,如果最后一个字符没有存储在对象中,那么它必须被重新读取,所以即使字符保证相同,你也可以期待它。

当我们打电话给unget时,我有点担心情况,但最后一个角色不可用。 putback会正确地赋值吗?我怀疑,但在操作文件时不应该这样。