1

私がする時

fstream someFile("something.dat", ios::binary|ios::out);
someFile.seekp(someLocation, ios::beg);
someFile.write(someData, 100);

あたかも ios::trunc を指定したかのように、適切な 100 バイトだけを置き換えるのではなく、ファイル全体をそれらの 100 バイトで置き換えるようです。ファイルを切り捨てないようにする移植可能な方法はありますか?

編集: ios::in を追加するとうまくいくようですが、なぜこれが必要なのですか?それは標準的な動作ですか?

編集 #2:既存のファイルに追加しようとしていません。100 バイトを置き換える必要がありますが、残りは影響を受けません。

4

4 に答える 4

2

ファイルの最後に書き込みたい場合は、追加フラグios::appが必要です。

ファイルの途中で任意にそれを行うには、適切な場所を探す必要があります。これは、ファイルを開いて入力および出力することで実行できますが、私が一時ファイルを作成し、入力をコピーしてマークを付け、新しいデータを書き込み、残りをEOFにコピーして、ファイルを閉じ、前のファイルを置き換えます。一時ファイルを含むバージョン。これは「マスターファイルの更新」と呼ばれます。

于 2009-04-27T02:16:10.630 に答える
2

AFAIR ios::out はファイルが出力用であることのみを指定し、ios:binary はファイルがバイナリであることのみを指定します。ストリームのデフォルトの動作は、新しいファイルを作成して古いファイルを上書きすることです。既存のファイルを変更する場合は、ios::app フラグを付けてファイルを開く必要があります。

ATM 参考文献を確認できないので、必ず再確認してください。ただし、正確だと思います。

于 2009-04-27T02:11:31.720 に答える
1

ios:in マスクは、ファイル ポインターがファイルの先頭に位置するように指示するため、最初から読み取りを開始できます。ただし、fseek を使用して、ファイル ポインターをファイルの先頭に設定することもできます。

于 2009-04-27T02:12:25.100 に答える