如果在"a + b"模式下打开文件指针,fseek()会将文件指针移动到文件的开头吗?

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函数的干预调用.