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

时间:2016-12-06 14:24:19

标签: c++ c++11 iostream portability

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

然后,想要从文件的开头重新读取char缓冲区中的read()。为实现这一目标,我们进行了无格式输入操作(使用posA)。

我们天真的做法

我们在Unix操作系统下做的是用tellg()中的值初始化// 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); ,然后转换使用它作为从文件开头的积分值偏移量:

(简化代码)

pos_type

遗憾的是,在移植代码时,我们发现tellg()返回的std::ifstream不一定是从流的开头偏移的字节(另请参阅this SO answer)。

问题

这引出了一个问题:是否有一种可移植的方法来获取输入流中的当前位置(或至少是read())作为流/文件开头的字节数? (因此,这个值可以特别用于selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.从开头直到这个确切位置的字节。)

1 个答案:

答案 0 :(得分:0)

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