1

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

4

2 回答 2

3

您在普通桌面和服务器操作系统上找到的文件系统不支持插入,因此无法做到这一点。

你必须重写文件。

于 2012-09-01T23:57:02.950 回答
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。它为您处理所有那些疯狂的事情,并使很多事情变得更简单。

于 2012-09-01T23:57:40.350 回答