gpt4 book ai didi

c++ - 如何使用 Boost IOStreams 的 Gzip 文件接口(interface)逐行读取?

转载 作者:IT老高 更新时间:2023-10-28 22:19:46 45 4
gpt4 key购买 nike

我设法集成了用于读取压缩文件的 boost Iostream API。我遵循了 boost 页面中的文档,到目前为止,我拥有以下代码:

std::stringstream outStr;  
ifstream file("file.gz", ios_base::in | ios_base::binary);
try {
boost::iostreams::filtering_istreambuf in;
in.push(boost::iostreams::gzip_decompressor());
in.push(file);
boost::iostreams::copy(in, outStr);
}
catch(const boost::iostreams::gzip_error& exception) {
int error = exception.error();
if (error == boost::iostreams::gzip::zlib_error) {
//check for all error code
}
}

代码运行良好(因此请忽略任何拼写错误。和上面的错误:))。

  1. 看起来上面的代码会在创建filtering_istreambuf时读取完整的文件并将其存储在内存中。这是真的吗,从我的调查来看,在我看来是这样吗?如果文件被读入内存,则此代码可能是大文件的问题(这就是我正在处理的问题)。
  2. 我当前的代码使用 gzgets API 从 zlib 中逐行读取 gzipped。有没有办法使用 boost API 逐行阅读?

最佳答案

1) 是的,上面的代码将 copy()将整个文件放入字符串缓冲区outStr .根据description of copy

The function template copy reads data from a given model of Source and writes it to a given model of Sink until the end of stream is reached.

2) 从 filtering_istreambuf 切换至filtering_istream并且 std::getline() 将起作用:

#include <iostream>
#include <fstream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
int main()
{
std::ifstream file("file.gz", std::ios_base::in | std::ios_base::binary);
try {
boost::iostreams::filtering_istream in;
in.push(boost::iostreams::gzip_decompressor());
in.push(file);
for(std::string str; std::getline(in, str); )
{
std::cout << "Processed line " << str << '\n';
}
}
catch(const boost::iostreams::gzip_error& e) {
std::cout << e.what() << '\n';
}
}

(如果需要证明,可以在该循环中 std::cout << file.tellg() << '\n';。它将增加相当大的 block ,但不会等于文件从一开始的长度)

关于c++ - 如何使用 Boost IOStreams 的 Gzip 文件接口(interface)逐行读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420620/

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