gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:37 30 4
gpt4 key购买 nike

我尝试将二进制文件内容的一部分读入字符串。为什么是字符串?我的消息协议(protocol)(使用 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_iterator 相互比较相等的两种情况:

  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.

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

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

关于C++如何将ifstream内容(来自文件)分配给具有偏移量的字符串(istreambuf_iterator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46955960/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com