c++ - 如何从 istream 的开头可移植地获取以字节为单位的偏移量?

标签 c++ c++11 iostream portability

我们通过 std::ifstream 访问一个文件,我们称它为 ifs。 在我们当前的过程中,我们进行了一些格式化的输入操作(即使用 operator>>()),这将我们带到流中的给定位置,我们称之为 posA

然后,要从文件的开头重新读取,直到char 缓冲区中的posA。为此,我们进行了无格式输入操作(使用 read())。

我们天真的方法

我们在 Unix 操作系统下所做的是用 tellg() 中的值初始化 posA,然后将其转换为从开始处偏移的整数值文件:

(简化代码)

// several formatted input operations
std::istream::pos_type posA = ifs.tellg(); 
ifs.seekg(0); // rewind to the beginning of the stream
ifs.read(buffer, posA);

遗憾的是,在移植代码时我们发现 tellg() 返回的 pos_type 不一定是流开头的字节偏移量(另见 this SO answer ) .

问题

这让我们想到了一个问题:是否有一种可移植的方法来获取输入流(或至少是 std::ifstream)中的当前位置作为从开始的字节数流/文件? (所以这个值尤其可以用于 read() 从开始到这个确切位置的字节)。

最佳答案

唯一的办法是以二进制模式打开文件,例如std::ifstream f{filename, std::ios_base::binary};.

关于c++ - 如何从 istream 的开头可移植地获取以字节为单位的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997629/

相关文章:

c++ - 通过宏定义编译标志(C++11 和优化)

c# - C# 和 C++ 中的 volatile 关键字

c++ - 类型线性谱系中最低的共同祖先

c++ - 代码块上的 Iostream 问题?

c++ - 将字符串列表输出到 ostream

c++ - 如何覆盖 C++ 标准库类函数?

c++ - WASAPI:为独占输出选择波形格式

c++ - #nomacros (EP003) 是什么,它还活着吗?

C++11 与不同类型的随机分布共享相同的函数

c++ - 将使用纠删码将 block 分割成 block ,从而提高网络吞吐量性能