从C语言的文件中删除一行
我想删除文件中的某些行,并根据行的某些部分是否与指定的string匹配,在同一个文件中插入某些行。 有没有办法做到这一点,而不使用临时文件复制内容等等?
问题是,一个文件(本质上)是磁盘上的字节数组(或者任何其他物理基底,但是,无论如何,字节!),“一行”可能需要不同数量的字节; 所以要插入或删除行(除非你总是用另外一行长度完全相同的字节来严格地replace一行)将需要通过字节的差异“移动”文件的所有其余部分“向上”或“向下” …这可能是一个非常繁重的操作(因为文件的其余部分可能是千兆字节,即使您只是将1行的长度更改为文件的开头)。
所以,这样的操作可能非常麻烦,因此在任何支持具有可变行长度(C,Python,Java,C ++,Ruby或任何其他此类语言)的文件的语言中,通常都不会提供为原语。 这是非常不可能的,你真的需要支付这样一个潜在的成本和性能风险(一个系统或磁盘崩溃在GB或数据上下移动可能会摧毁整个大文件的可用性)你试图避免的简单,充分,快速,安全和合理的技术已经基本上是零(所以这是远远不明显的为什么你要避免它?)。
使用与源文件不同的结果文件,当在源文件上执行结果文件时(如果在同一个文件系统中,则在大多数系统上执行primefaces操作),并且您确实拥有最好的一切可能的世界。
你不能在一个地方简单地“剪切”一个文件的一部分。 你总是在某处做一个临时拷贝。 这不是C的东西, 任何语言都是如此。
您可以将该文件进行mmap映射 ,然后当您find要删除的行时,可以将其后的所有内容都记忆到该行的起始位置。 我会质疑这将是多么有效率; 临时文件可能会更快。
如果文件不够大,无法在RAM上处理,那么可以使用链接列表中的string,其中每个节点表示一个Line,即链表的节点是根据'\ n'字符创build的,然后就可以请根据需要在链表上插入操作和删除操作,然后使用链接列表覆盖同一文件。
例如,mytext.txt
这是一个testing文件
必须在上面添加一行
这行必须被删除
现在,当你创build一个上面的文件的链接列表,就像
[这是一个testing文件] – > [必须添加一行] – > [该行必须被删除] – > [NULL]
插入操作将更改链接列表
[这是一个testing文件] – > [这是一个新行] – > [必须在上面添加一行] – > [该行必须被删除] – > [NULL]
删除操作将更改链接列表
[这是一个testing文件] – > [这是一个新行] – > [必须在上面添加一行] – > [NULL]
现在,您可以在每个节点的末尾使用'\ n'字符将链接列表写入mytext.txt文件。
最终文件将是,mytext.txt
这是一个testing文件
这是一条新的路线
必须在上面添加一行