从文本文件的顶部删除x行数

时间:2009-08-07 19:48:17

标签: file

我正在编写一个将使用日志文件的应用程序。我想要做的是当应用程序启动它时将检查日志文件是否超过一定大小,如果是,它将从日志文件顶部删除“x”行以缩短它。这样做的好方法是什么?将最新的条目写入文件顶部,然后在删除时从底部删除会更容易吗?

4 个答案:

答案 0 :(得分:1)

所以你有一个日志文件,我们称之为“log.log

首先,将log.log移至log.log.bak。打开它阅读。逐行读取,直到您读取 x 行数。打开一个新文件log.log进行写作。继续阅读log.log.bak中的行,并为每行写入log.log。如果没有其他行,请关闭log.loglog.log.bak,然后删除log.log.bak。

一些伪代码:

x = number of lines to delete

move log.log to log.log.bak

open log.log.bak for reading
while i have read < x lines
    read a line and throw it away

open log.log for writing
while there are more lines in log.log.bak
    read a line from log.log.bak
    write the line to log.log

close log.log
close log.log.bak

delete log.log.bak

答案 1 :(得分:1)

还有很多问题尚未解决 -

  1. 你在哪个环境?在Un * x中你可以简单地'尾巴-100 input.txt&gt; trimmed.txt'
  2. 您可以将文件加载到内存中,还是会太大?
  3. 你能使用中间档吗?
  4. 您有哪些语言/熟悉哪种语言?
  5. 您多久进行一次修剪?如果你写的比剪裁更频繁,写到底部(这很快)并且很少执行昂贵的修剪操作。
  6. 如果您有C可用,则可以使用fseek(f,0,SEEK_END);long size=ftell(f);找到文件大小(在打开f后立即)。

    如果您需要修剪,可以fseek(f,size-desired_size,SEEK_SET);然后while (fgetc(f)!='\n') {},这会将您带到您相交的行的末尾。

    然后将剩余的内容复制到新文件中。

答案 2 :(得分:1)

我不会删除一定数量的行。基本上你必须处理整个文件,如果你这样做,这可能是很多处理。通常的做法是滚动日志文件(将其重命名为其他内容,通常只是附加日期)并重新开始。

另外请记住,文件是一定大小并不能保证在那里有必要的行,在这种情况下你只是以昂贵的方式重命名文件。

当应用启动也从文件顶部开始时,我经常发现它很有用。

答案 3 :(得分:0)

为每种日志保留多个日志文件File1 - FileN。 当每个文件通过一些固定大小时,填写文件File1然后File2,依此类推。 当您填写FileN删除File1并重新开始(删除)并重写File1,File2 ...

这为您提供了一个周期性的固定大小日志。

注意:这需要您跟踪要写入的当前日志文件。这可以存储在单独的日志文件中。