gpt4 book ai didi

c++ - 使用 iostreams 读取文件的一部分

转载 作者:可可西里 更新时间:2023-11-01 18:19:07 26 4
gpt4 key购买 nike

我可以打开 ifstream(或以任何方式设置现有的)来只读取文件的一部分吗?例如,我想让我的 ifstream 从字节 10 到 50 读取文件。寻找位置 0 实际上是位置 10,读取过去的位置 40(实际上是 50)会导致EOF 等。这有可能吗?

最佳答案

它绝对可以通过实现过滤流缓冲区来完成:您可以从 std::streambuf 派生并获取您想要公开的范围和底层流缓冲区(好吧,一个指向它的指针) 作为参数。然后你会寻找开始位置。覆盖的 underflow() 函数将从底层流缓冲区读取到其缓冲区中,直到消耗了所需数量的字符。这是一个有些粗糙且完全未经测试的版本:

#include <streambuf>
struct rangebuf: std::streambuf {
rangebuf(std::streampos start,
size_t size,
std::streambuf* sbuf):
size_(size), sbuf_(sbuf)
{
sbuf->seekpos(start, std::ios_base::in);
}
int underflow() {
size_t r(this->sbuf_->sgetn(this->buf_,
std::min<size_t>(sizeof(this->buf_), this->size_));
this->size -= r;
this->setg(this->buf_, this->buf_, this->buf_ + r);
return this->gptr() == this->egptr()
? traits_type::eof()
: traits_type::to_int_type(*this->gptr());
}
size_t size_;
std::streambuf* sbuf_;
};

您可以使用指向此流缓冲区实例的指针来初始化 std::istream。如果这是一个经常性的需要,您可能想要创建一个派生自 std::istream 的类来设置流缓冲区。

关于c++ - 使用 iostreams 读取文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8964325/

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