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

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

本文关键字:偏移量 字符串 editor istreambuf 分配 内容 ifstream C++ 文件      更新时间:2023-10-16

我尝试将二进制文件内容的一部分读取到字符串中。为什么是绳子?我需要这个作为我的消息协议(与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,§[isreambuf.iterator.ops]/5):

返回:true当且仅当两个迭代器都在流的末尾,或者两者都不在流的末端,而不管它们使用什么streambuf对象。

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

我还不完全清楚这是要求的行为,但这显然是允许的