c - 限制日志/缓冲区文件中的行数

标签 c file-io fwrite

我有一个在 OpenWRT 路由器上运行的小程序,它记录到远程 MySQL 数据库。如果数据库不可用,程序将写入缓冲文件 (/var/buffer) 以防止数据丢失。问题是,由于它存储在路由器本身上,因此如果数据库关闭时间过长,就有可能很快耗尽空间。

我认为,如果我将文件最多保留 20,000 行,并在写入新行时丢弃最旧的行(一旦达到最大大小),我可以最大限度地减少数据丢失,而不必担心运行存储空间不足(一点损失并不是世界末日,我宁愿保留最新的东西,也不愿保留最旧的)。

根据我的研究,我了解到,如果不重写整个文件,就无法删除文件的第一行(不好,太耗时),每次我认为我接近另一个解决方案时,它就会崩溃。

还有更好的办法吗?或者每次我有新行来添加我唯一的选项时都要重写 20k 行文件?

最佳答案

您可以拥有log_LastLineNo变量将存储当时写入日志的最后一行的行号(第一次,一开始它将是 0 )。

继续写入文件,直到写入 20,000 行,并不断更新 log_LastLineNo .
之后开始从头开始覆盖文件,并设置一个变量 log_full = 1 .

现在
案例1: log_full = 0 & log_LastLineNo = [some value < 20000]
在这种情况下,从开始读取到 log_LastLineNo

案例2: log_full = 1 & log_LastLineNo = [some value < 20000]
在这种情况下,从 log_LastLineNo + 1 开始阅读直到第 20000 行,然后再次从开始到 log_LastLineNo .

关于c - 限制日志/缓冲区文件中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19595638/

相关文章:

java - 带有文件 I/O 和数组列表的 JTable

android - 如何在 Android 应用程序中添加和打开 sqlite 文件?

c - 使用 fread() 从二进制文件读取显示附加字符

C 不从文件加载信息(fread、fwrite)

c++ - fwrite 4 字符数组,将写入 7 而不是 4

C 文件处理 - 整数值 13 不能写入文件

c - 解方程与函数指针的困难

c - C 中的 vector/数组列表

c - 为什么以下代码会导致段错误 11?

c++ - 无法在 mac 上使用 qt app 打开文件