使用 iostreams 读取文件的一部分
read part of a file with iostreams
我可以打开一个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
设置流缓冲区的类。
您可以将所需的字节读取到字符串或字符数组中,然后可以将该字符串与 istringstream 一起使用,并使用它代替 ifstream。 例:
std::ifstream fin("foo.txt");
fin.seekg(10);
char buffer[41];
fin.read(buffer, 40);
buffer[40] = 0;
std::istringstream iss(buffer);
for (std::string s; iss >> s; ) std::cout << s << 'n';
如果您需要处理二进制文件,您也可以这样做:
std::ifstream fin("foo.bin", std::ios::binary | std::ios::in);
fin.seekg(10);
char buffer[40];
fin.read(buffer, 40);
std::istringstream(std::string(buffer, buffer+40));
你可能想要实现自己的流读取器类(最好通过一些 ifstream 接口,如果存在的话(。
相关文章:
- 如何检测文件夹是否太重,如果是,请删除其中的一部分
- 如何将文件的一部分读取到std::list缓冲区?
- 链接库作为 CMAKE 中工具链文件中标志的一部分
- 是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
- 按文件中列表中行的一部分排序
- qfile qtextStream仅读取文件的一部分
- 如何在C++中删除文件中的一部分文本
- C 如何将二进制文件的一部分复制到新文件
- Qml:从文件加载组件时将参数作为 URL 的一部分传递
- Eclipse-cdt boost shared_ptr.hpp:目录中没有此类文件,但它的一部分是包含文件
- 只读二进制zip文件的一部分
- c++为类和.cpp文件分离文件,函数不是类的一部分
- 复制存储在内存映射文件中的数组的一部分
- 如何在C 中获取.CSV文件的一部分
- 如何在C 中获取文本文件的一部分
- 使用输入作为名称的一部分创建文本文件
- 在c++中读取一行.txt文件的一部分
- 将二进制文件的一部分读入预先存在的basic_string对象
- C++ *char 缓冲区的一部分写入 Windows 上的临时文件
- 使用C++当我同时具有整数和字符数组时,如何将.txt文件中的数据作为链表的一部分访问