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

fseek does not work when file is opened in "a" (append) mode

本文关键字:文件 不起作用 追加 fseek 模式      更新时间:2023-10-16
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"

知道为什么吗?解决方案是什么,以便第二个代码输出与第一个代码完全相同?

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

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

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

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

如果最初要追加到现有文件,但后来fseek到任意位置,请使用 "r+" 后跟 fseek(f, 0, SEEK_END)