jbx*_*jbx 12 c fopen append fseek
我希望使用"a + b"模式打开一个文件,即如果它不存在则会自动创建,但如果它存在,我不想覆盖它.我希望能够读取和写入该文件.
该文件是二进制文件,我想保存其中特定的记录struct.所以我想对我想要fseek()的记录做,然后使用保存记录fwrite().
代码如下所示(MyRecord是a typedef到a struct,而FILENAMEa #define是文件名):
int saveRecord(MyRecord *pRecord, int pos)
{
FILE* file = fopen(FILENAME, "a+b");
if (file == NULL)
{
printf("Unable to open file %s\n", FILENAME);
return 0;
}
fseek(file, pos * sizeof(MyRecord), SEEK_SET);
fwrite(pRecord, sizeof(MyRecord), 1, file);
fclose(file);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
然而这段代码有追加记录到文件的末尾,即使我设置pos为0,为什么不fseek()与SEEK_SET追加模式工作?
我知道我可以简单地用"R + B"打开它,如果它失败,"WB"打开它,但我想知道为什么这不起作用,为什么fseek()有SEEK_SET离开的文件指针末端.对记录此行为的地方的任何引用都赞赏(因为我找不到任何,或者我使用了错误的关键字).
Fre*_*Foo 18
那是因为在a模式中,写入FILE*始终追加到最后.fseek仅在此模式下设置读指针.这在C标准7.19.5.3 fopen中有记载:
打开具有追加模式的文件(
'a'作为mode参数中的第一个字符)会导致对文件的所有后续写入强制转换为当前的文件结束,而不管对fseek函数的干预调用.