首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C语言从文件中删除一行

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

Stack Overflow用户
提问于 2009-07-20 04:33:29
回答 3查看 16.8K关注 0票数 17

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-20 04:40:24

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

因此,这样的操作可能非常繁琐,因此在支持可变行长文件的任何语言(C、Python、Java、C++、Ruby或任何其他类似语言)中通常都不会提供原语。当您试图避免的完全简单、足够、快速、安全和合理的技术基本上没有缺点时,您真的不可能需要付出如此潜在的性能和风险成本(在GB或数据上下“转换”期间发生的系统或磁盘崩溃可能会破坏整个大型文件的可用性)。

使用一个不同于源文件的结果文件,当这样做时,结果文件会覆盖源文件(如果你在相同的文件系统中,这在大多数系统上都是原子操作),你真的拥有了所有可能的世界中最好的东西。

票数 29
EN

Stack Overflow用户

发布于 2009-07-20 04:41:24

你不能轻易地就地“剪切”出文件的一部分。你总是在某个地方临时复制一份。这不是C语言的事情;它适用于任何语言。

您可以对文件执行mmap操作,然后当您找到要删除的行时,可以将它后面的所有内容都记录到该行的开始位置。我怀疑这样做的效率如何;临时文件可能会更快。

票数 3
EN

Stack Overflow用户

发布于 2017-07-10 18:45:27

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

例如,mytext.txt

这是一个测试文件

必须在上面添加一行

必须删除此行

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

这是一个测试文件->必须在->上方添加一行必须删除此行->

插入操作将链表更改为

这是一个测试文件->这是一个新行->必须在->上方添加一行必须删除此行-> NULL

删除操作将链表更改为

这是一个测试文件->这是一个新行-> A行必须添加到->上方

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

最后一个文件是mytext.txt

这是一个测试文件

这是一条新线路

必须在上方添加一行

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1151713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档