我有一个程序,我需要非常频繁地将文本行写入日志文件。我想将日志文件中的行数限制为 1000。当我将行写入文件时,它应该正常附加它们。一旦文件达到 1000 行,我想去掉第一行,然后追加新的。有谁知道是否有办法做到这一点而无需每次都重写整个文件?
5 回答
一般来说,对于这种情况,从一开始就一次删除多行会更好一些。
也就是说,如果你的限制是 1000 行,而你达到了 1000 行,则删除前 300 行左右,然后继续写入。这样,您就不会在此后的每一行中都执行删除操作,而只是每 300 次。如果您需要保留 1000 行,则改为保留 1300 并在达到 1300 时删除 300。
所有文件都必须与 FS 集群大小对齐。所以,不,没有办法。您可以在文件中追加一行,但如果不重写文件,则无法删除第一行。您可以轮流使用2个文件。或者在内存中使用一些缓冲区并定期刷新它。
我认为您仍然需要扫描文件以找出此时文件中有多少行。在这种情况下,您可以将它放在某种缓冲区中,您可以轻松地从中添加和删除。然后您进行日志记录,完成后,您可以使用缓冲区“重写”文件(或仅最后 1000 行)。上面讨论了其他替代方案。是的,尽量避免逐行删除。通常,这是一项昂贵的操作。
我在这里和 CodeProject 上发现了一些类似的主题:
http://www.codeproject.com/Articles/584794/Simple-logger-for-Cplusplus
希望你觉得它们有用:)
当您只想使用一个文件,并且行的长度不是恒定的时,没有办法不重写整个文件。
根据您附加到文件的频率,我认为这样做没有任何问题。大约 100 个字符的 1000 行只有大约 100kb,这并不多。此外,您可以添加一些滞后。
然而:
- 如果行长是恒定的(或者您将行长硬限制为某个常数),您可以只覆盖最旧的行。但是你必须跟踪旧/新行的日志文件位置
- 我会使用两个文件:第一个附加行的文件。当文件变满时,将其重命名为第二个,然后从头开始填充第一个。
任何时候你想记录,你都可以打开文件,读取你的写入索引,跳转到该位置,写入固定宽度的日志条目。当您的索引达到上限时,只需将其设置回 0。
但是,有很多警告 - 首先是每个正确的日志条目(假设您在其间关闭文件)都需要打开、读取、查找、写入、查找、写入和关闭 -找到你的索引,去它,写新条目,然后更新你的索引。您还存在编写固定大小数据元素的固有问题。此外,人类读者将依赖您的内容来了解文件的“开头”在哪里。大多数人期望“第 1 行”是第一行。
我更主张简单地拥有几个文件并“滚动”它们,以便每个文件本身都是连贯的,但是如果您只想要一个具有固定行数的文件,则循环缓冲区的想法可以工作。