【问题标题】:How one can safely serialize std::basic_istream<char>::pos_type?如何安全地序列化 std::basic_istream<char>::pos_type?
【发布时间】:2016-12-21 08:09:13
【问题描述】:

在我的一个项目中,我必须缓存有关在大文件中找到的某些数据块的位置信息。我已经实现了一个围绕 std::basic_istream&lt;char&gt;::pos_type 构建的小 API,放置在地图中。

现在我需要将这些描述符序列化为字节流并将它们写入磁盘以供进一步使用(在其他 *nix 机器上也是如此)。我已经读到这种类型是平台相关的,但仍然是一种 POD 类型。所以我的问题是:

  • 除了偏移量之外,保存一些东西是否会更好?例如。 std::fpos&lt;std::mbstate_t&gt;保持阅读结构的状态?
  • 如何安全地从std::basic_istream&lt;char&gt;::pos_type 获取和恢复偏移数据(以及其他需要的信息)?

提前谢谢你。

【问题讨论】:

  • 你真的关心序列化字符内状态吗?您是否真的使用 UTF-8 或类似的,并且可能需要序列化单个字符内的位置?
  • 不,我只对原子字节偏移感兴趣。但是抱怨任何可能影响性能的流读取结构的隐藏状态(这对我来说很重要)。
  • 听起来你可以序列化 streamoff 这只是一个数字。既然你说你不在乎序列化字符内的位置,这就足够了。您可以将其存储在 int64_t 中。
  • 好吧,显然我想多了。谢谢你,约翰。

标签: c++ linux file-io stl char-traits


【解决方案1】:

std::fpos&lt;mbstate_t&gt; 的结构未指定,mbstate_t 中可能存在非平凡状态。您当然不能可移植地序列化这些对象。您可以获取偏移类型的值(std::streamoff),它是一个整数类型,其值可以序列化。

【讨论】:

  • 我通过将istream::tellg() 返回的pos_type 静态转换为std::streamoff 来实现它。我想这是一种合法的方式,因为char_traits&lt;char&gt;::pos_type 被定义为std::fpos,它已将转换运算符定义为std::streamoff 以及根据std::fpos reference page 的ctr。谢谢你的回答,Dietmar。
猜你喜欢
  • 2014-05-24
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2011-08-07
相关资源
最近更新 更多