C++ iostreams解压缩返回一个空流
在过去的几天里,我一直在处理一个看似基本的问题,但似乎找不到答案。我读过许多类似问题的答案,但似乎没有一个适合我 我只是尝试使用boost的压缩/解压缩功能,但我想我一定是用错了。我的目标很简单——创建一个字符串,压缩它并写入文件,读取压缩文件,解压缩它并打印到std::cout(或任何其他流)。 我使用了以下代码:C++ iostreams解压缩返回一个空流,c++,boost,compression,gzip,iostream,C++,Boost,Compression,Gzip,Iostream,在过去的几天里,我一直在处理一个看似基本的问题,但似乎找不到答案。我读过许多类似问题的答案,但似乎没有一个适合我 我只是尝试使用boost的压缩/解压缩功能,但我想我一定是用错了。我的目标很简单——创建一个字符串,压缩它并写入文件,读取压缩文件,解压缩它并打印到std::cout(或任何其他流)。 我使用了以下代码: // write files std::stringstream str; str << "SampleString"; std::ofstream outFile_
// write files
std::stringstream str;
str << "SampleString";
std::ofstream outFile_raw("rawFile");
std::ofstream outFile_comp("compressedFile);
boost::iostreams::filtering_istream filteredString;
filteredString.push(boost::iostreams::zlib_compressor());
filteredString.push(str);
boost::iostreams::copy(str, outFile_raw);
boost::iostreams::copy(filteredString, outFile_comp);
\\read files
std::ifstream inFile_raw("rawFile");
std::ifstream inFile_comp("compressedFile);
boost::iostreams::filtering_istream filteredInput;
filteredInput.push(boost::iostreams::zlib_decompressor());
filteredInput.push(inFile_comp);
boost::iostreams::copy(inFile_raw, std::cout);
boost::iostreams::copy(filteredInput, std::cout);
//写文件
std::stringstream-str;
str您正在使用str
两次。在第一次使用它之后,它处于流的末尾,所以第二次不会读取任何内容
除此之外,要么显式刷新流和缓冲区,要么限制对象的范围,使其自动发生:
#include <boost/iostreams/filter/zlib.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/copy.hpp>
#include <fstream>
#include <iostream>
#include <sstream>
int main() {
// write files
{
std::stringstream str("SampleString");
std::ofstream outFile_raw("rawFile");
boost::iostreams::copy(str, outFile_raw);
}
{
std::stringstream str("SampleString");
std::ofstream outFile_comp("compressedFile");
boost::iostreams::filtering_istream filteredString;
filteredString.push(boost::iostreams::zlib_compressor());
filteredString.push(str);
boost::iostreams::copy(filteredString, outFile_comp);
outFile_comp.flush();
outFile_comp.close();
}
//read files
{
std::ifstream inFile_raw("rawFile");
boost::iostreams::copy(inFile_raw, std::cout << "\n inFile_raw: ");
}
{
std::ifstream inFile_comp("compressedFile");
boost::iostreams::filtering_istream filteredInput;
filteredInput.push(boost::iostreams::zlib_decompressor());
filteredInput.push(inFile_comp);
boost::iostreams::copy(filteredInput, std::cout << "\n filteredInput: ");
}
}
您正在使用str
两次。在第一次使用它之后,它处于流的末尾,所以第二次不会读取任何内容
除此之外,要么显式刷新流和缓冲区,要么限制对象的范围,使其自动发生:
#include <boost/iostreams/filter/zlib.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/copy.hpp>
#include <fstream>
#include <iostream>
#include <sstream>
int main() {
// write files
{
std::stringstream str("SampleString");
std::ofstream outFile_raw("rawFile");
boost::iostreams::copy(str, outFile_raw);
}
{
std::stringstream str("SampleString");
std::ofstream outFile_comp("compressedFile");
boost::iostreams::filtering_istream filteredString;
filteredString.push(boost::iostreams::zlib_compressor());
filteredString.push(str);
boost::iostreams::copy(filteredString, outFile_comp);
outFile_comp.flush();
outFile_comp.close();
}
//read files
{
std::ifstream inFile_raw("rawFile");
boost::iostreams::copy(inFile_raw, std::cout << "\n inFile_raw: ");
}
{
std::ifstream inFile_comp("compressedFile");
boost::iostreams::filtering_istream filteredInput;
filteredInput.push(boost::iostreams::zlib_decompressor());
filteredInput.push(inFile_comp);
boost::iostreams::copy(filteredInput, std::cout << "\n filteredInput: ");
}
}
非常感谢您的迅速回复!我设法让它正确解压缩,但我遇到了一些奇怪的事情-我试图读取两个压缩文件(分别),它们都是压缩的,并用与上述代码相同的方式创建的。当第一个较小的文件成功解压缩时,第二个较大的文件(55MB未压缩,320KB压缩)抛出一个“输入流错误”异常(我尝试捕获异常,但它没有提供任何进一步的信息)。你知道为什么它对一个文件有效而对另一个文件无效吗。如果你不能解决这个问题,请在这里发布一个新的问题,并附上一个SSCCE(最好是一个链接,指向一个在你的系统上失败的文档):Q&a是交易。画出来并问后续问题会使问题偏离主题(其他人永远不会有“完全相同的问题”,也不会在评论中找到答案)。非常感谢您的快速回复!我设法让它正确解压缩,但我遇到了一些奇怪的事情-我试图读取两个压缩文件(分别),它们都是压缩的,并用与上述代码相同的方式创建的。当第一个较小的文件成功解压缩时,第二个较大的文件(55MB未压缩,320KB压缩)抛出一个“输入流错误”异常(我尝试捕获异常,但它没有提供任何进一步的信息)。你知道为什么它对一个文件有效而对另一个文件无效吗。如果你不能解决这个问题,请在这里发布一个新的问题,并附上一个SSCCE(最好是一个链接,指向一个在你的系统上失败的文档):Q&a是交易。画出来并问后续问题会使问题偏离主题(其他人永远不会有“完全相同的问题”,也不会在评论中找到答案)