将有限数量的行写入文本文件的算法

时间:2013-10-08 19:35:29

标签: c++ algorithm file text

我有一个程序,我需要经常将文本行写入日志文件。我想将日志文件中的行数限制为1000.当我将行写入文件时,它应该正常附加它们。一旦文件达到1000行,我想摆脱第一行,然后附加新行。有没有人知道是否有办法这样做而不必每次都重写整个文件?

5 个答案:

答案 0 :(得分:1)

一般情况下,这样的情况从一开始就一次删除一行以上就好一点。

也就是说,如果您的限制为1000行,并且您达到1000行,则删除前300行,然后继续写入。这样,您不会在此后写入的每一行执行删除操作,每300次执行一次。如果你需要持续1000行,那么最多可以保持1300,并在达到1300时删除300。

答案 1 :(得分:1)

所有文件都必须与FS群集大小对齐。所以,不,没有办法。您可以在文件中附加一行,但如果没有文件重写,则无法删除第一行。 您可以轮流使用2个文件。 或者在内存中使用一些缓冲区并定期冲洗它。

答案 2 :(得分:1)

我认为你现在仍然需要扫描文件以找出文件中有多少行。在这种情况下,您可以将它放在某种缓冲区中,您可以轻松添加和删除。 然后进行日志记录,完成后,您可以使用缓冲区“重写”文件(或仅使用最后1000行)。 上面讨论了其他替代方案。 是的,尽量避免逐行删除。通常,这是一项昂贵的操作。

我在这里和CodeProject上找到了一些类似的主题:

Small logger class;

Flexible logger class using standard streams in C++

http://www.codeproject.com/Articles/584794/Simple-logger-for-Cplusplus

希望你发现它们很有用:)

答案 3 :(得分:0)

如果您只想使用一个文件,并且行的长度不是常量,则无法重写整个文件。

根据您追加文件的频率,我认为没有任何问题。 1000行约100个字符仅约100kb,这并不多。此外,您可能会添加一些滞后现象。

然而:

  • 如果行长度不变(或者您将行长度硬限制为某个常量),则可以覆盖最旧的行。但是你必须跟踪旧/新行的日志文件位置
  • 我会使用两个文件:第一个附加行的文件。当文件变满时,将其重命名为第二个,并从头开始填充第一个。

答案 4 :(得分:0)

无论何时想要记录,都可以打开文件,读取写入索引,跳转到该位置,然后编写固定宽度的日志条目。当您的索引达到上限阈值时,只需将其设置为0。

但是有很多警告 - 首先是每个正确的日志条目(假设你在其间关闭文件)将需要开放,读取,搜索,写入,搜索和写入,关闭 - 找到你的索引,转到它,写新条目,然后更新你的索引。您还有编写固定大小数据元素的固有问题。此外,人类读者将依赖于您的内容来了解​​文件“开头”的位置。大多数人都希望“第1行”成为第一行。

我是一个更大的倡导者,只需要一些文件并“滚动”它们,这样每个文件本身就是连贯的,但是如果你只想要一个具有固定行数的文件,那么循环缓冲区的想法可以工作。