在"a"(追加)模式下打开文件时,fseek不起作用

Raj*_*jat 20 c c++ file fseek

FILE* f = fopen("rajat", "w");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);
Run Code Online (Sandbox Code Playgroud)

成功回归:"someteis a"

FILE* f = fopen("rajat", "a");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);
Run Code Online (Sandbox Code Playgroud)

不行.返回"sometextis a"

有什么想法吗?对此有什么解决方案,以便第二个代码输出与第一个完全相同?

das*_*ght 27

在追加模式下打开时,文件指针会在每次写入之前返回到文件末尾.您可以重新定位指针以fseek进行读取,但只要调用写入文件的函数,指针就会返回到文件末尾.

或者,换句话说,为了防止数据丢失,"写指针"的位置会覆盖"读指针"的位置.在任何追加之后,写指针反弹到新的EOF.

此链接的答案引用了C标准的相应部分.

"w+"如果要写入文件中的任意位置,请使用该模式.将覆盖现有文件.

如果您想最初附加到现有文件,但随后fseek到任意位置,请使用"r+"后跟fseek(f, 0, SEEK_END).

  • @MichaelBurr"a"的行为旨在支持诸如(或可能是)从几个不同进程编写的日志文件之类的东西.寻求最终应该是原子的(如果可能的话); 在Unix平台上,该文件将以"O_APPEND"标志打开.然后,用户代码确保流具有足够大的缓冲区,输出日志记录,并调用`fflush`来写入它. (7认同)
  • 我一直发现“a”的行为是不直观的。 (2认同)