我想要使用"a+b"模式打开文件,即如果文件不存在,则会自动创建,但如果存在,则不希望覆盖它。我希望能够读写文件。
该文件是二进制的,我想要在其中保存特定struct
的记录。因此,我想使用fseek()
将光标移到我想要的记录处,然后使用fwrite()
保存记录。
代码如下(MyRecord
是一个typedef
到一个struct
,而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,此代码仍将记录附加到文件末尾。为什么在追加模式下使用fseek()
和SEEK_SET
不起作用?我知道可以使用"r+b"打开它,如果失败则使用"wb"打开它,但我想知道为什么这样做不行,以及为什么fseek()
在使用SEEK_SET
时会将文件指针留在结尾。如果有任何关于此行为已被记录的参考资料,我将不胜感激(因为我找不到任何资料,或者我使用了错误的关键字)。
freopen
的解决方案吗?不确定它在实践中是否有效(freopen
规范不清,理论上可能是无用的),但或许可以尝试一下。 - R.. GitHub STOP HELPING ICE