正如标题所示,我如何使用fopen将数据写入文件的特定部分,同时按下现有数据而不删除它。我已经使用了fseek以及SEEK_SET和SEEK_CUR,到目前为止,我能够将新数据写入文件的正确部分,但是,现有数据的前几行会被删除。
答案 0 :(得分:3)
您在普通桌面和服务器操作系统上找到的文件系统不支持插入,因此无法完成此操作。
你必须重写文件。
答案 1 :(得分:3)
我必须承认,我很少使用fopen
进行“复杂”数据操作,并且在文件中间附加内容不是我经常做的事情。通常,当我需要这种使用模式时,我只是用新数据覆盖整个文件。所以可能有一种聪明的方法可以在文件中间附加数据,但我不知道:我很确定你只能覆盖它。
我能想到的最简单的方法是在文件中间追加:找到你需要写的地方,找到你需要重新定位的字节数,找到要插入的数据的长度,移动将光标写入(需要写入+长度),用您需要重新定位的数据覆盖该点的数据,然后首先编写您需要写入的内容。
#include <stdio.h>
#include <stdlib.h>
size_t finsert(void* data, size_t length, FILE* fp)
{
const long writePosition = ftell(fp);
fseek(fp, 0, SEEK_END);
const long fileSize = ftell(fp);
const long relocatedDataSize = fileSize - writePosition;
char* dataToRelocate = malloc(relocatedDataSize);
fseek(fp, writePosition, SEEK_SET);
fread(dataToRelocate, relocatedDataSize, 1, fp);
fseek(fp, writePosition + length, SEEK_SET);
fwrite(dataToRelocate, relocatedDataSize, 1, fp);
free(dataToRelocate);
fseek(fp, writePosition, SEEK_SET);
return fwrite(data, length, 1, fp);
}
请注意,您需要对文件进行读写访问,只需写入就不会删除它。
另外,正如Cole Johnson所提到的,如果您使用的文件“像数据库”,请考虑使用SQLite。它为你处理所有那些疯狂的东西,并使很多事情变得更加简单。