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

时间:2017-10-26 13:41:09

标签: c++ iterator offset ifstream 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>()));

但这是从头到尾阅读文件。 我想只阅读给定位置的零件。例如,从位置字节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方法,并且真的很想找到一种方法来实现这一点。

任何人都可以帮助我吗?谢谢

1 个答案:

答案 0 :(得分:2)

很抱歉,但通常不可能。

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

  1. 在从同一个流构建两个迭代器后立即
  2. 当它们都是流末端迭代器时。
  3. 只是想知道这意味着什么,请考虑标准中的示例代码实现其equal()如下(N4659,§[istreambuf.iterator.ops] / 5):

      

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

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

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