2012-05-17 3 views
17
FILE* f = fopen("rajat", "w"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

は正常に返さ:fseek関数ファイルが "A" で開かれたときに動作しません(追加)モード

しかし

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

動作しません "someteis"。 "sometextis a"を返します

なぜでしょうか?これに対する解決策は何ですか.2番目のコードは最初のコードとまったく同じですか?

+1

最初のものに '' w + "'は必要ありませんか?それ以外の場合、ファイルは破棄され、再作成されます。 –

答えて

24

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

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

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

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

既存のファイルに最初に追加したい場合は、fseekを任意の場所に追加する場合は、"r+"に続いてfseek(f, 0, SEEK_END)を使用します。

+0

ファイル内の既存のデータを破壊したくない場合は、 '' w + ''ではなく '' r + "'を使うべきです。 –

+0

@JamesKanzeこれは正しいです、私は数分前に編集でこの点を明確にしました。 'r +'の欠点はファイルが存在しなければならないということです。 – dasblinkenlight

+0

私はいつも '' a "'の動作が非直感的であることを発見しました。 –

関連する問題