Ответ 1
1) Да, приведенный выше код будет copy()
весь файл в буфере строк outStr
. В соответствии с описанием копии
Копия шаблона функции считывает данные из данной модели источника и записывает их в данную модель раковины до тех пор, пока не будет достигнут конец потока.
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';
внутри этого цикла, если вы хотите получить доказательство), он будет увеличиваться в значительных кусках, но он не будет равен длине файла с самого начала)