我们正在开发一个序列化库(灵感来自boost :: serialization)。
它的主要目的是在应用程序运行时,对应用程序数据对象(每个都包含多个“节点”)的输入和输出使用单个iostream
。该库最后保存了新节点,但能够从随机位置加载节点。
当使用'格式化输出'后端(即使用流的operator>>
和operator<<
序列化为文本)时,当最后一个格式化的输入到达流的末尾时会发生一种特殊情况:
从this documentation开始,预计格式化输入会在读取流中的最后一个值时设置eofbit
(因为它必须到达结尾才能知道值是完全阅读。
编辑:在评论之后,Pete Becker发表了几条评论,这是一个简单的说明,即成功的格式化输入仍可以设置eofbit,请点击此处:{{ 3}}
然后,下一个格式化的输出将失败(仍然根据http://ideone.com/SPirIC),因为如果设置了eofbit
,格式化输出将失败。
我们主要是寻找一种以最明智的方式处理这种“边缘”案件的方法。
我们可以在“输出”函数的开头添加一个检查(例如clear
iostream
如果eofbit
是唯一的位集,但是这样的检查可能会运行千位加载一个完整对象的时间,并且只有很短的一部分时间实际上对运行条件体有任何意义。
有这个初始步骤可以使函数混乱吗?
加分问题:设置流eofbit
时强制要求输出失败的理由是什么? EOF实际上是写入所述流的有效位置(简单地清除该位,而不移动流put-pointer,解决问题)。