gpt4 book ai didi

c - 如果以 "a+b"模式打开文件,fseek() 是否会将文件指针移动到文件开头?

转载 作者:太空狗 更新时间:2023-10-29 16:40:01 28 4
gpt4 key购买 nike

我希望使用“a+b”模式打开一个文件,即如果它不存在它会自动创建,但如果存在我不想覆盖它。我希望能够读取和写入文件。

该文件是二进制的,我想在其中保存特定struct 的记录。所以我想对我想要的记录执行 fseek(),然后使用 fwrite() 保存记录。

代码如下所示(MyRecordstructtypedef,而 FILENAME#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;
}

但是,即使我将 pos 设置为 0,此代码也只是将记录 append 到文件末尾。为什么 fseek() 不是 SEEK_SET 在追加模式下工作?

我知道我可以简单地用“r+b”打开它,如果它用“wb”打开它失败,但我想知道为什么这不起作用以及为什么 fseek()使用 SEEK_SET 将文件指针留在末尾。感谢任何对记录此行为的地方的引用(因为我找不到任何地方,或者我使用了错误的关键字)。

最佳答案

那是因为在 a 模式下,写入 FILE* 总是追加到末尾。 fseek 在此模式下仅设置读取指针。这记录在 C 标准 7.19.5.3 fopen 中:

Opening a file with append mode ('a' as the first character in the mode argument) causes all subsequent writes to the file to be forced to the then current end-of-file, regardless of intervening calls to the fseek function.

关于c - 如果以 "a+b"模式打开文件,fseek() 是否会将文件指针移动到文件开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5532371/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com