如何使用fopen将数据写入文件的特定部分并将现有数据推送到文件中而不删除它?

时间:2012-09-01 23:54:52

标签: php fopen fwrite fseek

正如标题所示,我如何使用fopen将数据写入文件的特定部分,同时按下现有数据而不删除它。我已经使用了fseek以及SEEK_SET和SEEK_CUR,到目前为止,我能够将新数据写入文件的正确部分,但是,现有数据的前几行会被删除。

2 个答案:

答案 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。它为你处理所有那些疯狂的东西,并使很多事情变得更加简单。