2016-12-21 5 views
0

を上書きし、私はまだそれがどのように動作するかを理解することはできません。のは、この最小限の例を見てみましょう:これは動作しませんファイル全体を読んで、そして同じのstd :: fstreamの中のすべての

#include <fstream> 
#include <string> 

int main() 
{ 
    std::fstream fs{ "somefile.txt", std::fstream::out | std::fstream::in }; 
    std::string line; 

    while (std::getline(fs, line)) 
    { 
    // reads the whole file 
    } 

    // the purpose is to overwrite the whole file 
    fs.seekp(0, std::ios_base::beg); // moves at the beginning 
    fs << "Hello world!" << std::endl; // writes in the file 

    // possibly other read/write 
} 

、1つが最初に読み、その後、私が読んすべてに応じて同じストリームに書き込むことはできませんようです。 ファイルを閉じる際の回避策を知り、std::ios_base::truncフラグで開きます。しかし、それは無意味であるように思われます:なぜそのような制限がありますか?読んだ後に技術的にファイルを上書きすることはできませんか?

+1

多分あなたは、これは問題ではありませんが、あなたはそれがないという余分なものを必要としない限り、 'のstd :: endl'を使用していない' eof'ビット –

+0

をクリアする必要があります。 '' \ n ''は行を終わらせます。 –

+0

@ForceBru何も書き込まないので、ファイルの変更時刻は変更されません。 – Boiethios

答えて

1

ファイル全体を読んだ後、fseof状態になっています。 IO操作後に行うことができるように状態をクリアする必要があります。

4

フェイルビットがセットされるまでループ反復します。前追求するだけでclear()フラグ:

fs.clear(); 

あなただけの十分な開始ビットを上書きする場合。また、私は思い明示的close()open()それストリームを切り捨てるしたい場合は、どこopen()std::ios_base::inを設定していないでしょう。

+0

はい、文字列を書き込みますが、ファイル全体が上書きされません。 – Boiethios

+0

@Boiethios:あなたはその機能を実行するためのコードを書いていませんでした。そのためにfstreamを責めないでください。 –

+0

ファイルを解放してから再度開く必要があるのはなぜですか?通常は必要ない操作があります! – Boiethios

関連する問題