我正在处理一个文本文件,其中包含我的程序控制下的进程列表以及相关数据。
在某些时候,其中一个进程将完成,因此需要从文件中删除(因为它不再受控制)。
以下是文件内容的示例(其中“随机”添加了肠道):
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 :(得分: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()调用,这是一个原子操作。