6

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

4

2 に答える 2

3

質問を順番に取る:

1: ストリームバッファオブジェクト (boost::iostream::filtering_streambuf や std::streambuf など) は、ストリーム オブジェクト (std::ostream や boost の実装など) と交換できません。そうは言っても、「myCompressedFileStream」のような streambuf オブジェクトを ostream オブジェクトのコンストラクターに渡すことができます (この boost iostream チュートリアルでは、例を示した適切な説明が提供されています)。また、boost のストリームバッファは標準ライブラリのストリームバッファと互換性があるため、std::ostream/ofstream 参照を受け入れる関数を変更する必要はありません。streambufs をストリームとして渡すことはできません。

2: 上記と同様に、挿入演算子は、ストリームバッファではなく、ストリームに対して定義されます。

3: 通常、前にディレクトリ名がないファイルは、実行可能ファイルのディレクトリに作成されます。そうは言っても、Finder が非 Finder プロセスによって更新/作成されたファイルを反映するのがいくぶん遅いことがあることがわかりました。ls を使用したターミナルでは、これらの問題は発生しませんでした。ただし、それがあなたの問題に関連しているかどうかはわかりません。

于 2013-07-25T07:23:54.193 に答える