2017-10-25 12 views
4

私は今日のコードの興味深い作品を見てきました:`ifstream`を読み書きの両方で開くことができるのはなぜですか?

ifstream fil; 

fil.open("ini.txt", std::ios::in | std::ios::out); 

は、私は、その壊れたについて暴言をするところだったが、私のastonishementに私はcppreference.comは明らかに、これが正しいと考えていることを見た:

http://en.cppreference.com/w/cpp/io/basic_ifstream/open

mode - ストリームオープンモードを指定します。これは、以下の定数が定義され、ビットマスクタイプです:

  • に:
、限り私は理解して

どのようにすることができifstreamを書き込むためのオープン:オープン外

  • を読み取るためINPUTファイルストリームで、読み書きの両方で開くことができますか?

    ifstreamの代わりにfstreamである必要はありませんか?あなたがfstream使用する必要が

  • +2

    この目的のために 'std :: fstream'が必要です。 – user0042

    +0

    @ user0042 Fine;だから、なぜcppreferenceはIFSTREAM :: openの下で 'std :: ios :: in'と' std :: ios :: out'の両方をリストしているのですか? – gaazkam

    +0

    あなたは何を期待していますか?例外? – user0042

    答えて

    0

    fstream file("input.txt", ios::in | ios::out | ios::app); 
    int data; 
    
    file >> data; 
    file << data +1; 
    
    file.close(); 
    
    +1

    質問にはすでにfstreamでなければならないことが分かっています。彼らはなぜそれがすべてifstreamで動作するのかを尋ねています。 – UKMonkey

    1

    std::ifstreamstd::basic_filebuf以上のハンドルのようなものです。 std::basic_ifstream::rdbufを呼び出して、ハンドルからそのバッファにアクセスすることもできます。

    ハンドルからそのバッファを盗み出し、別のバッファに割り当てることができます(にはどのように行きますか?)。そしてここに興味深いことがあります。バッファーはifstreamからofstreamに移動できます。そしてそれは書き込みのためにバッファを開くことができる必要があります。そのように、あなたがリンクされ非常に同一の参照ページが、これは言う:

    を効果的rdbuf()->open(filename, mode | ios_base::in)

    を呼び出し、これは、後にバッファそのものを操作しないようにする便利な関数です。

    関連する問題