2011-03-06 197 views
0

我有一个文本文件,它包含了我的计划控制下的进程列表,以及相关的数据一起工作。从文本文件中删除一行?

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

这里是文件内容的样品(其具有enteries添加的“随机”):

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命令,但我不是很熟悉它们,所以请如果这是你的建议,举一个例子。

谢谢!

回答

0

的唯一方法是通过复制删除线下跌超过被删除的字符之后到来的每个字符。

它更为高效简单地重写文件。

0

我怎么能这样做,而无需再次写入文件?

你不行。文件系统(可能除了更深奥的记录)不支持插入或删除。

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

1

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

1

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

使用“外部UNIX命令”来做到这一点的显而易见的方法是grep -v "PID=26416"(或者显然需要删除任何PID)。

编辑:这可能是值得一提的是如果行都是相同长度(如你在这里显示)和顺序并不重要,你可以通过复制的最后一行到更有效地删除一行该空间正在腾空,然后缩短文件以消除最后一行。这将只有工作,如果他们真的都是相同的长度,但(例如,如果你得到了“1” PID,你需要填充它的长度相同的其他文件中)。

0

它UNIX命令是:

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

mv myfile.tmp myfile 

grep -v的部分的文件输出,而不与搜索项的行。

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

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

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

0

您可以使用SED:

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

-i是就地编辑。它还会创建一个带有新扩展名的备份文件.bak

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

test是文件名

0

你为什么要在文本文件中维护这些?这不是这种任务的最佳模式。但是,如果你坚持使用它......如果这些行保证都是相同的长度(这与示例中的方式相同),并且如果文件中行的顺序无关紧要,那么你可以写上对已死亡,然后通过与(F)一行缩短文件截断(工艺线的最后一行)调用,如果你是一个POSIX系统上:见乔纳森·莱弗勒在How to truncate a file in C?

答案但请注意netrom的答案,它提供了三种不同的更好的方式来维护这些信息。另外,如果你坚持使用一个文本文件(最好每次从头开始写数据结构,按照netrom的第一个建议进行维护),并且要确保该文件始终格式良好,然后编写新数据放入同一设备上的临时文件(放在同一目录中最简单),然后执行一次rename()调用,这是一次原子操作。