我有一个程序,我需要经常将文本行写入日志文件。我想将日志文件中的行数限制为1000.当我将行写入文件时,它应该正常附加它们。一旦文件达到1000行,我想摆脱第一行,然后附加新行。有没有人知道是否有办法这样做而不必每次都重写整个文件?
答案 0 :(得分:1)
一般情况下,这样的情况从一开始就一次删除一行以上就好一点。
也就是说,如果您的限制为1000行,并且您达到1000行,则删除前300行,然后继续写入。这样,您不会在此后写入的每一行执行删除操作,每300次执行一次。如果你需要持续1000行,那么最多可以保持1300,并在达到1300时删除300。
答案 1 :(得分:1)
所有文件都必须与FS群集大小对齐。所以,不,没有办法。您可以在文件中附加一行,但如果没有文件重写,则无法删除第一行。 您可以轮流使用2个文件。 或者在内存中使用一些缓冲区并定期冲洗它。
答案 2 :(得分:1)
我认为你现在仍然需要扫描文件以找出文件中有多少行。在这种情况下,您可以将它放在某种缓冲区中,您可以轻松添加和删除。 然后进行日志记录,完成后,您可以使用缓冲区“重写”文件(或仅使用最后1000行)。 上面讨论了其他替代方案。 是的,尽量避免逐行删除。通常,这是一项昂贵的操作。
我在这里和CodeProject上找到了一些类似的主题:
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行”成为第一行。
我是一个更大的倡导者,只需要一些文件并“滚动”它们,这样每个文件本身就是连贯的,但是如果你只想要一个具有固定行数的文件,那么循环缓冲区的想法可以工作。