24
FILE* f = fopen("rajat", "w");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);

正常に返されます: "someteis a"

しかし

FILE* f = fopen("rajat", "a");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);

動作しません。「sometextis a」を返します

理由はありますか?2番目のコードが最初のコードとまったく同じように出力されるようにするための解決策は何ですか?

4

1 に答える 1

31

追加モードで開くと、ファイル ポインターは、すべての書き込みの前にファイルの末尾に戻されます。読み取りのためにポインターの位置を変更できますfseekが、ファイルに書き込む関数を呼び出すとすぐに、ポインターはファイルの最後に戻ります。

または、別の言い方をすれば、データの損失を防ぐために、「書き込みポインター」の位置が「読み取りポインター」の位置をオーバーライドします。追加後、書き込みポインターは新しい にバウンスしますEOF

このリンクの回答は、C 標準の適切なセクションを参照しています。

"w+"ファイルの任意の場所に書き込みたい場合はこのモードを使用してください。既存のファイルは上書きされます。

最初に既存のファイルに追加したいが、その後任意fseekの場所に追加したい場合は、 ."r+"fseek(f, 0, SEEK_END)

于 2012-05-17T08:00:27.580 に答える