boost filtering_streams に関するいくつかの基本的な質問。std::ofstream& のパラメーターを取る関数が多数あります
void foo(std::ofstream& outStream)
{
// lots of operations, like this:
outStream << "various bits of text";
}
void StreamSomeTextToFile(char* fileName)
{
ofstream myFileStream(fileName, ios::out | ios::app | ios::binary);
foo(myFileStream);
myFileStream.close();
}
次に、boost filtering_stream を使用して、圧縮された ZIP ファイルに出力したいと思います。コンパイル、リンク、および完全に機能するパックおよびアンパック用の一般的に引用されている boost filtering_streams テスト コード。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();
}
3 つの質問:
1) 以前 std::ofstream& outStream を受け入れていたすべての関数は、タイプ boost::iostreams::filtering_streambuf& のパラメーターを受け入れる必要がありますか? または、これらの多数の(「foo」)関数がストリームタイプのいずれかのタイプで機能するように、適切なパラメータータイプがありますか?
2) 私の単純なテスト ケースでは、filtering_streambuf でストリーム演算子構文を使用できませんでした。
myCompressedFileStream << "some text";
これにより、エラーが発生しました。「operator<<」に一致しません。同様に、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
'
3) 一般的なテスト ケースのサンプル コード (以下) では、ファイル "hello.z" が作成された後に見つからないことに混乱しました。アンパック コード (以下も) は、明確にそれを参照しています。注:場所は最終的に発見されました:それは /Library/Preferences/ にありました
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);
}
ところで: XCode 3.2.6、GNU 4.0、OS X 10.6.8