C++ 如何将 ifstream 内容(来自文件)分配给具有偏移量的字符串 (istreambuf_iterator)

C++ How to assign ifstream content (from file) to string with offset (istreambuf_iterator)

我尝试将二进制文件内容的一部分读入字符串。为什么是字符串?我的消息协议(使用 protobuf)需要这个。

以下效果很好:

std::string* data = new std::string();
std::ifstream ifs("C:\data.bin", std::ios::binary);
data->assign((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));

但这是为了从头到尾读取文件。 我只想阅读给定位置的部分。例如从位置字节 10 开始:

std::string* data = new std::string();
std::ifstream ifs("C:\data.bin", std::ios::binary);
ifs.seekg((10);
data->assign((std::istreambuf_iterator<char>(ifs)), ???????);

但如何调整结束或偏移量?我没有找到任何例子。我知道有 ifstream.read() 进入缓冲区的例子。我在我的整个程序中使用了 assign into string 方法,我真的很想找到一种方法来使用偏移量。

谁能帮帮我?谢谢

抱歉,这通常是不可能的。

标准只定义了 istreambuf_iterators 比较相等的两种情况:

  1. 从同一流构造两个迭代器后立即,并且
  2. 当它们都是流结束迭代器时。

只是为了说明这意味着什么,请考虑标准中的示例代码实现其 equal() 如下(N4659,§[istreambuf.iterator.ops]/5):

Returns: true if and only if both iterators are at end-of-stream, or neither is at end-of-stream, regardless of what streambuf object they use.

因此,对于 any 一对迭代器,如果一个在流的末尾,而另一个不在流的末尾,它们将比较不相等。对于所有其他情况(都在流的末尾,或都不在流的末尾),它们将比较相等(即使,例如,它们甚至不是从同一流派生的)。

我不完全清楚这是 必需的 行为,但显然 允许 行为——而不只是允许作为偶然发生的奇怪极端情况,但有明确记录,是预期的行为。