Php 如何使用fopen将数据写入文件的特定部分,并在不删除现有数据的情况下向下推送现有数据?

Php 如何使用fopen将数据写入文件的特定部分,并在不删除现有数据的情况下向下推送现有数据?,php,fopen,fwrite,fseek,Php,Fopen,Fwrite,Fseek,正如标题所问,如何使用fopen将数据写入文件的特定部分,同时向下推现有数据而不删除它。我已经将fseek与SEEK_SET和SEEK_CUR一起使用,到目前为止,我能够将新数据写入文件的正确部分,但是,删除了现有数据的前几行 您在普通桌面和服务器操作系统上找到的文件系统不支持插入,因此无法执行此操作 您必须重写文件。在普通桌面和服务器操作系统上找到的文件系统不支持插入,因此无法执行此操作 你必须重写文件。 我必须承认,我很少使用 fOpen对“复杂”的数据操作和在文件中间附加东西不是我经常做的

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

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


您必须重写文件。

在普通桌面和服务器操作系统上找到的文件系统不支持插入,因此无法执行此操作


<>你必须重写文件。

我必须承认,我很少使用<代码> fOpen<代码>对“复杂”的数据操作和在文件中间附加东西不是我经常做的事情。通常,当我需要这种使用模式时,我只是用新数据覆盖整个文件。所以可能有一种聪明的方法在文件中间附加数据,但我不知道:我确信你只能重写。< /P>

我想在文件中间追加的最简单的方法是:找到你需要写的地方,找到你要重新分配的字节数,找到要插入的数据的长度,把写的光标移动到(你需要写+长度),用你需要重新定位的数据从那个点重写数据。然后写下你首先需要写的东西

#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);
}
#包括
#包括
大小finsert(无效*数据、大小长度、文件*fp)
{
常量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+长度,SEEK_SET);
fwrite(dataToRelocate,relocatedDataSize,1,fp);
免费(数据重新定位);
fseek(fp,writePosition,SEEK_SET);
返回fwrite(数据,长度,1,fp);
}
请注意,您需要对该文件进行读写访问,仅写不会剪切它


同样,正如Cole Johnson所提到的,如果您使用的是“像数据库”这样的文件,请考虑使用SQLite。它处理了所有这些疯狂的事情,使很多事情变得简单很多。

< P>我必须承认,我很少使用<代码> fOpen<代码>,用于“复杂”的数据操作,在文件中间附加东西不是我经常做的事情。通常,当我需要这种使用模式时,我只是用新数据覆盖整个文件。所以可能有一种聪明的方法在文件中间附加数据,但我不知道:我确信你只能重写。< /P>

我想在文件中间追加的最简单的方法是:找到你需要写的地方,找到你要重新分配的字节数,找到要插入的数据的长度,把写的光标移动到(你需要写+长度),用你需要重新定位的数据从那个点重写数据。然后写下你首先需要写的东西

#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);
}
#包括
#包括
大小finsert(无效*数据、大小长度、文件*fp)
{
常量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+长度,SEEK_SET);
fwrite(dataToRelocate,relocatedDataSize,1,fp);
免费(数据重新定位);
fseek(fp,writePosition,SEEK_SET);
返回fwrite(数据,长度,1,fp);
}
请注意,您需要对该文件进行读写访问,仅写不会剪切它


同样,正如Cole Johnson所提到的,如果您使用的是“像数据库”这样的文件,请考虑使用SQLite。它可以为您处理所有这些疯狂的事情,并使许多事情变得简单。

听起来好像您正在使用一个文件作为数据库。请不要将文件用于此目的听起来像是将文件用于数据库。请不要将文件用于此目的,也许我用错了方法。如何:如何制作文件的临时副本并将其重命名为其他文件,删除原始文件,打开与原始文件同名的新文件,将新数据粘贴到顶部,然后将临时复制的现有数据粘贴到重命名的文件?@Garry,您要做的是在文件开头写入数据,对吧?没错。我想在文件的开头写入数据,并将现有数据向下推,而不会过度写入其中的一部分。@Garry,没有内置的函数。创建一个新文件,写入需要写入的数据,将旧文件的内容转发到新文件,并用新文件替换旧文件。也许我的做法不对。如何:如何制作文件的临时副本并将其重命名为其他文件,删除原始文件,打开与原始文件同名的新文件,将新数据粘贴到顶部,然后将临时复制的现有数据粘贴到重命名的文件?@Garry,您要做的是在文件开头写入数据,对吧?没错。我想在文件的开头写入数据,并将现有数据向下推,而不会过度写入其中的一部分。@Garry,没有内置的函数。创建新文件,写入需要写入的数据,将旧文件的内容转发到新文件,并用新文件替换旧文件。