seekp値を使用しない書き込み関数

私はC + +を使用してファイルの特定の場所にエントリを書き込もうとしています

とても基本的に私は持っている

ofstream ofs("file.dat", ios::binary | ios::app);
ofs.seekp(220, ios::beg);
ofs.write((char *)&i, sizeof(i));

しかし、私が何をするにせよ、それは常にファイルの最後に書いてください。

これは、 iso :: app に関連していると思います

app (append) Set the stream's position indicator to the end of the stream before each output operation

しかし、私が食べ物を使用するか、何も使用しないと、常にファイルの内容が消去されます。

どのような助けが素晴らしいだろう:)

4

3 答え

はい、この動作の原因となるのは iOS :: app です。これを iOS :: in |に置き換えます。 iOS :: out

edit: It wasn't clear from your question, but your comments suggest that you're trying to insert data in the middle of the file, rather than overwrite a portion of the file. If that is indeed the case, you pretty much have to use a second file for that.

5
追加された
@Paté:デフォルトでは、使用していないので無関係です( iOS :: binary ... を使用しています)。また、あなたが「休憩」と言うとき、どのように正確に?
追加された 著者 NPE,
ofstreamデフォルトはios :: outです。 iOS :: inを追加すると、プログラムが中断されます。
追加された 著者 Paté,
エラーフラグ(eofbit、failbit、badbit)をチェックしましたか?
追加された 著者 Dana Holt,
@Paté:はい、データを挿入することはできません。既存のデータを上書きするようになります。最初の部分を(挿入したいところまで)出力し、新しいデータを挿入し、残りの部分を追加する必要があります。
追加された 著者 Dana Holt,

ファイル追加モード

OS(およびネットワークファイルシステム)が追加モードをサポートしている場合、追加モードを設定すると、複数のライターが存在する場合、書き込まれたデータは既存のデータを上書きしませんことが保証されます。これは、別のプロセスからのシークと書き込みの競合のために、追加モードなしでは実行できないものです。ログファイルの重要な保証です。

追加モードでは、ファイルの最後にのみ定義することができます。

Iostreamオープンモード

According to [ofstream.cons], ofstream (s, mode) calls rdbuf()->open(s, mode|ios_base::out).

[filebuf.members]の "File open modes"の表によると、 filebuf :: open の動作はオープンモードの fopen の項で定義されています。

  • out means "w"
  • app and app|out mean "a"
  • in|out means "r+"
  • in|out|trunc means "w+"

fopen man によると、これらのモードは次のようになります。

  • r+ Open for reading and writing.
  • w Truncate file to zero length or create text file for writing.
  • w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated.
  • a Open for appending (writing at end of file). The file is created if it does not exist.

最後に、 ate fseek(file、0、SEEK_END)を意味します。

したがって、既存のデータを破壊することなく任意の位置に書き込むために開く場合は、 fopen(s、 "r +")または ofstream(s、ios :: in iOS :: out)

IOW、C/C ++では、上書きせずにファイルを開いて書き込み用に開く必要があります。

POSIXの世界

O_READ O_WRITE O_CREATというPOSIXオープンフラグに直接アクセスするには、代わりにPOSIXの open O_TRUNC ... filebuf :: open とは異なり、これらはあまり強力ではありませんが、コード>フラグ。

もちろん、この関数は標準C ++の一部ではありません。私はすべての関連システムが open をサポートしていると思います。

1
追加された

iOS :: app の代わりに iOS :: out を使用してみましたか?

EDIT:

@curiousguyが参照しているドキュメントを読んだら、 iOS :: in | iOS :: out の代わりに、切り詰めることを避けるために、ios :: out

1
追加された
既存のファイルを切り捨てたいのですか?
追加された 著者 curiousguy,
@curiousguy:いいえ、ドキュメントを読んだ後、私は自分の答えを更新しました。
追加された 著者 Dana Holt,