用C语言从文件中删除一行

用C语言从文件中删除一行,c,file-io,C,File Io,我想删除文件中的某些行,并根据行的某些部分是否与指定字符串匹配,在同一文件中插入某些行。有没有一种方法可以不使用临时文件将内容复制到磁盘上等等?问题是,文件(本质上)是磁盘上的字节数组(或任何其他物理基片,但无论如何,是字节!),“一行”可以占用不同数量的字节;因此,要插入或删除行(除非您总是严格地用另一行完全相同的字节长度替换一行),需要将文件的所有其余部分“向上”或“向下”移动字节差。。。这可能是一个极其繁重的操作(因为文件的其余部分可能是千兆字节,即使您只是在文件开头更改一行的长度1字节)

我想删除文件中的某些行,并根据行的某些部分是否与指定字符串匹配,在同一文件中插入某些行。有没有一种方法可以不使用临时文件将内容复制到磁盘上等等?

问题是,文件(本质上)是磁盘上的字节数组(或任何其他物理基片,但无论如何,是字节!),“一行”可以占用不同数量的字节;因此,要插入或删除行(除非您总是严格地用另一行完全相同的字节长度替换一行),需要将文件的所有其余部分“向上”或“向下”移动字节差。。。这可能是一个极其繁重的操作(因为文件的其余部分可能是千兆字节,即使您只是在文件开头更改一行的长度1字节)

<> >,这样的操作可能是非常繁琐的,因此通常不提供任何支持可变长度的文件(C、Python、java、C++、露比或任何其他这样的语言)的原语。您不太可能真的需要在性能和风险方面付出如此巨大的潜在代价(在GB或数据上下“移动”期间发生系统或磁盘崩溃可能会破坏整个庞大文件的可用性),因为,而你们试图避免的合理技术基本上并没有任何负面影响(所以你们为什么要避免它还很不明显?)

使用一个不同于源文件的结果文件,将结果文件置于源文件之上(如果您在同一个文件系统中,这是大多数系统上的一种原子操作),您确实拥有了所有可能的最佳效果。

您无法轻松地“剪切”文件的一部分。你总是在某个地方做一份临时拷贝。这不是一个C的东西;任何语言都是如此


您可以删除文件,然后当您找到要删除的行时,您可以将该行之后的所有内容存储到该行开头的位置。我怀疑这会有多大的效率;临时文件可能更快。

如果文件不够大,无法在RAM上处理,则可以使用字符串链表,其中每个节点代表一行,也就是说,链接列表的节点是基于“\n”字符创建的,然后您可以根据需要对链接列表执行插入操作和删除操作,然后可以使用链接列表覆盖同一文件

例如,mytext.txt

这是一个测试文件

必须在上面添加一行

这一行必须删除

现在,当您创建上述文件的链接列表时,如下所示

[这是一个测试文件]->[必须在上面添加一行]->[必须删除该行]->[空]

“插入”操作将链接列表更改为

[这是一个测试文件]->[这是一个新行]->[必须在上面添加一行]->[必须删除这一行]->[空]

删除操作将链接列表更改为

[这是一个测试文件]->[这是一个新行]->[必须在上面添加一行]->[空]

现在,您可以在每个节点的末尾使用“\n”字符将链接列表写入mytext.txt文件

最后一个文件是mytext.txt

这是一个测试文件

这是一条新路线

必须在上面添加一行


临时文件更安全。当然,这不是我的第一选择。。。。或者任何选择。这是我能想到的唯一能满足要求的东西。这种方法可以说更安全(没有临时文件权限问题),但我同意它会在出现故障时损坏文件。