C++如何将ifstream内容(从文件)分配给带偏移量的字符串(istreambuf_iterator)

Adm*_*mut 5 c++ iterator ifstream offset assign

我尝试将二进制文件内容的一部分读入字符串.为什么是字符串?我需要这个用于我的消息协议(使用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>()));
Run Code Online (Sandbox Code Playgroud)

但这是从头到尾读取文件.我想只阅读给定位置的零件.例如,从位置字节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)), ???????);
Run Code Online (Sandbox Code Playgroud)

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

谁能帮我?谢谢

Jer*_*fin 4

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

\n\n

istreambuf_iterator该标准仅定义了s 比较相等的两种情况:

\n\n
    \n
  1. 在从同一流构造两个迭代器之后立即,并且
  2. \n
  3. 当它们都是流尾迭代器时。
  4. \n
\n\n

为了了解这意味着什么,请考虑标准中的示例代码实现如下equal()(N4659,\xc2\xa7[istreambuf.iterator.ops]/5):

\n\n
\n

返回:true当且仅当两个迭代器都位于流末尾,或者都不位于流末尾,无论streambuf它们使用什么对象。

\n
\n\n

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

\n\n

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

\n