c++ - 处理大文件(> 2GB)时将 pos_type 分配给 uint64_t 是否安全?

标签 c++ winapi stl posix fstream

当尝试以跨平台方式处理大文件(2/4GB)时,将 pos_type 转换为 uint64_t 是否安全?

  • 目标平台:运行当前 Linux 发行版、Windows、Mac 的台式机。
  • 任务:随机二进制文件访问(tellpseekp)。
  • 寻求:最接近标准(POSIX、Win API)、便携且安全的解决方案。

最佳答案

无论是在实践中还是在理论上。就标准而言,我不 认为可以保证 pos_type 甚至可以转换为 整型;从逻辑上讲,它不应该是,因为它包含几个 独立数据:距文件开头的偏移量 多字节解码的状态信息。

另一方面,在实践中,您不应该遇到任何问题 基于 Unix 的机器;在Windows下,数值不一定 如果文件以文本模式打开,则意义重大,但您可以将 pos_typeuint64_t 并返回,不会丢失值(除非有 确实是原始 pos_type 中重要的多字节状态,但我 不知道 Windows 下有任何编码会出现这种情况)。

应该可以在编译时确定 pos_type 是否会隐式转换为整型,并在某些情况下使用它 有点像static_assert。然而,我认为这并没有什么意义。它 不会确定积分值是否以任何方式可用,除了 重新转换回 pos_type。 (这可能是某种魔法 例如,cookie。但我不会太担心。这 标准允许很多没有合理实现的事情 做。请记住,即使在 Windows 下,该值并不总是 表示可以读取的确切字节数。

关于c++ - 处理大文件(> 2GB)时将 pos_type 分配给 uint64_t 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8756496/

相关文章:

c - wsprintf 将我限制为 1024 个字符?

c++ - 类内部的Boost Thread无法访问成员变量

c++ - 将 vector 填充到 map 中

c++ - 使用继承的成员函数指针的 unordered_map,使用 std :function

c++ - 使用原始输入同时获取两只老鼠的数据

c++ - 将 CString 转换为 Char 以更新数据库

c++ - 绕道绘制文本

c++ - erase 获取 const_iterator 但使用迭代器调用(非 const)

c++ - 两个线程之间的同步队列

c++ - 内存管理和重新分配