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要求的重点是在写入输出之前摆脱输入缓冲区,以便可以使用相同的缓冲区用于阅读和写作。AFAIK,您甚至不需要寻找文件结尾,只要您寻找,您就可以在任何地方寻找。

第二个描述比第一个强,但这是意料之中的。第一个仅声明所有写入都转到 EOF,即无法在其他任何地方写入。第二个建立了从读取到写入的切换必须伴随刷新或查找的规则,以确保缓冲区的读取和写入方面不会混淆。

于 2012-11-03T20:13:46.073 回答