从文本文件中删除一行?

时间:2011-03-06 21:33:03

标签: c file file-io

我正在处理一个文本文件,其中包含我的程序控制下的进程列表以及相关数据。

在某些时候,其中一个进程将完成,因此需要从文件中删除(因为它不再受控制)。

以下是文件内容的示例(其中“随机”添加了肠道):

PID=25729 IDLE=0.200000 BUSY=0.300000 USER=-10.000000
PID=26416 IDLE=0.100000 BUSY=0.800000 USER=-20.000000
PID=26522 IDLE=0.400000 BUSY=0.700000 USER=-30.000000

因此,例如,如果我想删除说PID = 26416的行....我怎么能这样做,而不重写文件?

我可以使用外部unix命令,但是我对它们并不是很熟悉,所以如果这是你的建议,请举个例子。

谢谢!

7 个答案:

答案 0 :(得分:1)

您可以将文件的内容保留在临时内存中,然后重写该文件。或者,您可以为每个PID提供一个文件,其中包含相关信息。然后,只需在文件不再运行时删除它。或者您可以使用数据库代替。

答案 1 :(得分:1)

正如其他人已经指出的那样,你唯一真正的选择是重写文件。

使用“外部UNIX命令”执行此操作的明显方法是grep -v "PID=26416"(或者您要删除的任何PID,显然)。

编辑:可能值得一提的是如果这些行的长度都相同(如您在此处所示)并且顺序无关紧要,您可以通过复制更有效地删除一行进入空间的最后一行空出,然后缩短文件,以消除最后一行。这将工作,如果它们的长度确实相同(例如,如果你的PID为'1',你需要将它填充到与文件中其他的相同的长度)。

答案 2 :(得分:0)

唯一的方法是将删除的行之后的每个字符复制到已删除的字符上。

简单地重写文件效率要高得多。

答案 3 :(得分:0)

  

如果不重新编写文件,我怎么能这样做?

你做不到。文件系统(可能除了更深奥的基于记录的文件系统之外)不支持插入或删除。

因此,您必须将行写入临时文件,直到要删除的行,跳过该行,然后将其余行写入文件。完成后,将临时文件重命名/复制到原始文件名

答案 4 :(得分:0)

它的unix命令是:

grep -v "PID=26416" myfile > myfile.tmp

mv myfile.tmp myfile

grep -v部分输出的文件没有带搜索词的行。

> myfile.tmp部分为此输出创建一个新的临时文件。

mv部分将临时文件重命名为原始文件。

请注意,我们在这里重写文件,而且,如果有人在两个命令之间写入文件,我们就会丢失数据。

答案 5 :(得分:0)

您可以使用sed:

sed -i.bak -e '/PID=26416/d' test

-i用于编辑。它还会使用新扩展名.bak

创建备份文件

-e用于指定模式。 / d表示应删除与模式匹配的所有行。

test是文件名

答案 6 :(得分:0)

为什么要在文本文件中维护这些内容?这不是这项任务的最佳模式。但是,如果你坚持使用它...如果这些线保证都是相同的长度(它从样本中看起来那样),如果文件中的行顺序无关紧要,那么你如果你在POSIX系统上,可以在已经死亡的进程的行上写下最后一行,然后使用(f)truncate()调用将文件缩短一行:请参阅How to truncate a file in C?中的Jonathan Leffler的回答

但请注意netrom的答案,它提供了三种不同的更好的方法来维护这些信息。

另外,如果您坚持使用文本文件(最好每次从您维护的数据结构写入,根据netrom的第一个建议),并且您希望确保文件始终格式良好,然后编写新文件将数据放入同一设备上的临时文件中(将其放在同一目录中最简单),然后执行rename()调用,这是一个原子操作。

相关问题