我想删除文件中的某些行,并根据行的某些部分是否与指定的字符串匹配,在同一文件中插入某些行。有没有一种方法可以做到这一点,而不使用临时文件将内容复制到其中,等等?
发布于 2009-07-20 04:40:24
问题是,一个文件(本质上)是磁盘上的一个字节数组(或其他任何物理底层,但无论如何,字节!),“一行”可能占用不同数量的字节;因此,插入或删除行(除非您总是严格地用另一行完全相同的字节长度替换行)将需要根据字节数的差异“上移”或“下移”文件的所有其余部分……这可能是一个极其繁重的操作(因为文件的其余部分可能是千兆字节的,即使您只是将一行的长度按1字节更改到文件的开头)。
因此,这样的操作可能非常繁琐,因此在支持可变行长文件的任何语言(C、Python、Java、C++、Ruby或任何其他类似语言)中通常都不会提供原语。当您试图避免的完全简单、足够、快速、安全和合理的技术基本上没有缺点时,您真的不可能需要付出如此潜在的性能和风险成本(在GB或数据上下“转换”期间发生的系统或磁盘崩溃可能会破坏整个大型文件的可用性)。
使用一个不同于源文件的结果文件,当这样做时,结果文件会覆盖源文件(如果你在相同的文件系统中,这在大多数系统上都是原子操作),你真的拥有了所有可能的世界中最好的东西。
发布于 2009-07-20 04:41:24
你不能轻易地就地“剪切”出文件的一部分。你总是在某个地方临时复制一份。这不是C语言的事情;它适用于任何语言。
您可以对文件执行mmap操作,然后当您找到要删除的行时,可以将它后面的所有内容都记录到该行的开始位置。我怀疑这样做的效率如何;临时文件可能会更快。
发布于 2017-07-10 18:45:27
如果文件不够大,无法在RAM上处理,则可以使用字符串的链表,其中每个节点代表一条线,也就是说,链表的节点是基于'\n‘字符创建的,然后您可以根据需要对链表执行插入操作和删除操作,然后可以使用链表覆盖同一文件。
例如,mytext.txt
这是一个测试文件
必须在上面添加一行
必须删除此行
现在,当您创建上述文件的链表时,它将如下所示
这是一个测试文件->必须在->上方添加一行必须删除此行->
插入操作将链表更改为
这是一个测试文件->这是一个新行->必须在->上方添加一行必须删除此行-> NULL
删除操作将链表更改为
这是一个测试文件->这是一个新行-> A行必须添加到->上方
现在,您可以在每个节点的末尾使用'\n‘字符将链表写入mytext.txt文件。
最后一个文件是mytext.txt
这是一个测试文件
这是一条新线路
必须在上方添加一行
https://stackoverflow.com/questions/1151713
复制相似问题