C++ iostreams解压缩返回一个空流

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_

在过去的几天里,我一直在处理一个看似基本的问题,但似乎找不到答案。我读过许多类似问题的答案,但似乎没有一个适合我

我只是尝试使用boost的压缩/解压缩功能,但我想我一定是用错了。我的目标很简单——创建一个字符串,压缩它并写入文件,读取压缩文件,解压缩它并打印到std::cout(或任何其他流)。 我使用了以下代码:

// 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是交易。画出来并问后续问题会使问题偏离主题(其他人永远不会有“完全相同的问题”,也不会在评论中找到答案)