3

追加更新モードでファイルを開いた後、ファイルへの各書き込みの前にファイル配置ステートメントを実行する必要がありますか?

FILE *h;
int ch;
if ((h = fopen("data", "a+")) == NULL) exit(1);
if (fseek(h, 0 SEEK_SET)) exit(2);
ch = fgetc(h); /* read very first character */
if (ch == EOF) exit(3);

/* redundant? mandatory? */
fseek(h, 0, SEEK_END); /* call file positioning before output */

/* add 1st character to the end of file on a single line*/
fprintf(h, "%c\n", ch);

C11 標準は次のように述べています。

7.21.5.3/6 ... ファイルへの後続のすべての書き込みは、その時点で最新のファイルの終わりに強制されます ...

7.21.5.3/7 ... ファイル配置関数の呼び出しを介在させずに、入力の直後に出力を続けてはならない ...

7.21.5.3/7のshallは7.21.5.3/6の説明より強いと思います。

4

1 に答える 1

4

ポータブル C ではおそらく冗長ではありません。基になるファイル記述子は常に (少なくとも Unix では) 追加されますが、fseek/fflush要件のポイントは、出力に書き込む前に入力バッファーを削除して、同じバッファーを使用できるようにすることです。読み書き用。知る限り、ファイルの最後までシークする必要さえありません。シークする限り、どこでもシークできます。

2 番目の説明は最初の説明よりも強力ですが、それは予想されることです。最初のものは、すべての書き込みが EOF になること、つまり他の場所に書き込む方法がないことのみを示しています。2 つ目は、バッファーの読み取りと書き込みの側面が混同されないようにするために、読み取りから書き込みへの切り替えにはフラッシュまたはシークを伴う必要があるというルールを確立します。

于 2012-11-03T20:13:46.073 に答える