Boost logo

Boost Users :

Subject: [Boost-users] [iostreams] Some basic questions about filtering_stream
From: Stephen Greenfield (StephenG_at_[hidden])
Date: 2013-07-24 20:41:41


Some basic questions about Boost filtering_streams. I have dozens of functions that presently take a parameter of std::ofstream&. For example:

    void foo(std::ofstream& outStream)
    {
        // lots of operations, like this:
          outStream << "various bits of text";
    }

Which then get used as thus:

     void StreamSomeTextToFile(char* fileName)
    {
          ofstream myFileStream(fileName, ios::out | ios::app | ios::binary);
          foo(myFileStream);
          myFileStream.close();
    }

Now I'd like to use the boost filtering_stream to output to a compressed ZIP file. I've compiled, linked and run the commonly cited boost filtering_stream test code for packing and unpacking and it worked perfectly for me. Now I'd like to try to substitute my use of std::ofstream& with the filtering_stream:

     void StreamSomeCompressedTextToFile(char* fileName)
    {
          ofstream myFileStream(destPath, std::ios_base::out | std::ios_base::app | std::ios_base::binary);
          boost::iostreams::filtering_streambuf<boost::iostreams::output> myCompressedFileStream;
          myCompressedFileStream.push(boost::iostreams::zlib_compressor());
          myCompressedFileStream.push(myFileStream);

          foo(myCompressedFileStream); // I can't just pass myCompressedFileStream to foo(std::ofstream&), right?
          myFileStream.close();
    }

THREE QUESTIONS:

1) Do all my functions that previously accepted std::ofstream& outStream need to now accept a parameter of type boost::iostreams::filtering_streambuf<boost::iostreams::output>& ? Or, is there a proper parameter type so those numerous ("foo") functions could work with EITHER type of stream type?

2) In my simple test cases, I was not able to use stream operator syntax with the filtering_streambuf:

          myCompressedFileStream << "some text";

this generated the the error: no match for 'operator<<'. I similarly had compile errors with write():

          `error: 'class boost::iostreams::filtering_streambuf<boost::iostreams::output, char, std::char_traits<char>, std::allocator<char>, boost::iostreams::public_>' has no member named 'write`'

Could this be a missing header? If so, I haven't been able to determine which one.

3) In the common test case example code (below), I was confused that I could not locate the file "hello.z" after it had been created. The unpack code (also below) executed correctly and clearly references the created file -- so where can it be found?

     void pack()
    {
          std::ofstream file("hello.z", std::ios_base::out | std::ios_base::binary);

           boost::iostreams::filtering_streambuf<boost::iostreams::output> out;
           out.push(boost::iostreams::zlib_compressor());
           out.push(file);
           char data[5] = {'a', 'b', 'c', 'd', 'e'};
           boost::iostreams::copy(boost::iostreams::basic_array_source<char>(data, sizeof(data)), out);
           file.close();
    }

     void unpack()
    {
           std::fstream file("hello.z", std::ios_base::in | std::ios_base::binary);
           boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
           in.push(boost::iostreams::zlib_decompressor());
           in.push(file);
           boost::iostreams::copy(in, std::cout);
    }

My code is being developed on XCode 3.2.6, GNU 4.0, Mac OS X 10.6.8



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net