23

私は次のコードを持っていて、それはかなりうまく機能します(それがかなり遅いという事実を除いて、しかし私はそれについてあまり気にしません)。これがインファイルの内容全体をアウトファイルに書き込むことは直感的ではないようです。

// Returns 1 if failed and 0 if successful
int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
    ifstream infile(inFilename.c_str(), ios::binary);
    ofstream outfile(outFilename.c_str(), ios::binary);

    if( infile.is_open() && outfile.is_open() && infile.good() && outfile.good() )
    {
        outfile << infile.rdbuf();

        outfile.close();
        infile.close();
    }
    else
        return 1;

    return 0;
}

何か洞察はありますか?

4

3 に答える 3

28

iostreamクラスは、I/Oバッファの単なるラッパーです。それiostream自体はそれほど多くのことをしません…主に、それはoperator>>フォーマット演算子を提供します。バッファは、から派生したオブジェクトによって提供されます。このオブジェクトはbasic_streambuf、を使用して取得および設定できますrdbuf()

basic_streambufは、ファイルや文字列などの読み取り/書き込み用の統一されたインターフェイスを提供するためにオーバーライドされる多数の仮想関数を備えた抽象ベースです。関数basic_ostream<…&gt;::operator<<( basic_streambuf<…&gt; )は、基になるデータソースが使い果たされるまでバッファを読み取り続けるように定義されています。

iostreamしかし、ひどい混乱です。

于 2010-01-26T23:27:18.147 に答える
19

はい、それは標準で指定されており、実際には非常に単純です。指定されたオブジェクトの基になるオブジェクトrdbuf()へのポインタを返すだけです。basic_streambuf[io]stream

basic_ostream<...>の内容を書き出すoperator<<ポインタのオーバーロードがあります。basic_streambuf<...>basic_streambuf<...>

于 2010-01-26T18:51:09.537 に答える
1

ソースコードをざっと見てみると、それbasic_ofstreamがのラッパーであることがわかりますbasic_filebuf

于 2020-06-09T07:41:54.797 に答える