C++ 在“中”打开文件时,fseek不工作;a「;(附加)模式

C++ 在“中”打开文件时,fseek不工作;a「;(附加)模式,c++,c,file,fseek,C++,C,File,Fseek,成功返回:“someteis a” 但是 不起作用。返回“SomeTextIsa” 你知道为什么吗?如何解决这个问题,使第二个代码的输出与第一个代码完全相同?当您以追加模式打开时,文件指针将在每次写入之前返回到文件末尾。您可以使用fseek重新定位指针进行读取,但只要调用写入文件的函数,指针就会返回到文件末尾 或者,换句话说,为了防止数据丢失,“写指针”的位置覆盖“读指针”的位置。在任何附加之后,写入指针都会反弹到新的EOF 答案参考C标准的相应章节 如果要写入文件中的任意位置,请使用“w+”模

成功返回:“someteis a”

但是

不起作用。返回“SomeTextIsa”


你知道为什么吗?如何解决这个问题,使第二个代码的输出与第一个代码完全相同?

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

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

答案参考C标准的相应章节

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


如果您想先附加到现有文件,然后将
fseek
附加到任意位置,请使用
“r+”
,然后使用
fseek(f,0,SEEK\u END)

第一个文件是否需要
“w+”
?否则,文件将被销毁并重新创建。如果您不希望文件中的现有数据被销毁,则应使用
“r+”
,而不是
“w+”
@JamesKanze这是正确的,我在几分钟前的编辑中澄清了这一点。然而,
r+
的一个缺点是文件必须存在。我总是发现
“A”
的行为是不直观的。@MichaelBurr
“A”
的行为旨在支持从几个不同进程写入(或可能写入)的日志文件之类的东西。最终的搜索应该是原子的(如果可能);在Unix平台上,文件将使用
“O_APPEND”
标志打开。然后,用户代码确保流具有足够大的缓冲区,输出日志记录,并调用
fflush
来写入它。@LaurieStearn听起来是个不错的编辑建议。点击“建议编辑”链接,编辑答案;我很乐意接受你的编辑。非常感谢。
FILE* f = fopen("rajat", "w");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);
FILE* f = fopen("rajat", "a");
fputs("sometext", f);
fseek(f, 6, SEEK_SET);
fputs("is a", f);
fclose(f);