【问题标题】:How to always have N number of lines in a ofstream file with real-time data如何始终在具有实时数据的 ofstream 文件中包含 N 行
【发布时间】:2026-01-21 23:00:01
【问题描述】:

我想使用 ofstream 向文件写入行 10 次,我希望将第 11 行写入第 1 行的位置,将第 12 行写入第 2 行,依此类推(这样我的文件将始终有 10行,以保留日志文件大小)。 到目前为止,我最好的尝试涉及一个循环缓冲区,如下所示:

#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
​
int main()
{
    ifstream myfile("new.txt");
    string line, buffer[10];
    const size_t size = sizeof buffer / sizeof * buffer;
    size_t i = 0;
​
    while (getline(myfile, line))
    {
        buffer[i] = line;
        if (++i >= size)
        {
            i = 0;
        }
    }
​
    ofstream myfileo("new.txt");
    for (size_t j = 0; j < size; ++j)
    {
        myfileo << buffer[i] << "\n";
        if (++i >= size)
        {
            i = 0;
        }
    }
    myfileo << "hey";
    return 0;
}

但这往往只适用于 VS windows,而不适用于在 linux 上运行的具有实时数据的实际 c++ 代码(我知道,这很愚蠢)。 “实时数据”部分是 myfileo

C++中只有10行的日志文件真的应该这么难吗?!我认为另一个好的尝试是在达到一定数量的行后创建新的日志文件并删除以前的日志文件,但我不知道我该怎么写! 谢谢

【问题讨论】:

  • 什么不起作用?
  • buffer 是您实施 10 行规则的地方。您要写入文件的所有内容都需要到那里(使用适当的 10 行强制规则),并且您需要设计一个方案,以将buffer 刷新到文件的频率(每 5 秒?每 5 行?等等)。如果您直接写信给myfileo,您的所有执行规则都会被绕过。
  • “我认为另一个不错的尝试是在达到一定数量的行后创建新的日志文件并删除以前的日志文件” 将“delete”替换为覆盖,您就已经得到了更简单和更标准的方法:创建文件log0.txtlog1.txt 等,跟踪当前文件大小,一旦文件变得太满,将“索引”增加一回到@ 987654328@,如果您已达到某个限制。这样做的逻辑并不太短,但应该相当直接地实现......
  • 使用内存映射文件。 (例如github.com/mandreyel/mio)。您可以像在内存中一样管理文件。

标签: c++ linux


【解决方案1】:

你可以通过做一个得到你想要的行为

 myfileo.seekp(0, std::ios_base::beg);

...每次你刚刚写完第十行文本。这会将文件的写入位置移回文件顶部,从那里您将覆盖文件的现有内容,而不是使文件变大。

我说“有点”,因为除非所有文本行的长度完全相同,否则只要前 10 行的长度超过新的 10 行。也许这对你的目的是可以接受的,我不知道。

另一种可能的方法是在 10 行之后 myfileo.close() 您的 ofstream 和 myfileo.open() 一个具有不同名称的新文件,然后开始写入该文件。然后当新文件“满”时,delete 旧文件,并重复该过程。这样一来,磁盘上总是有两个文件,一个完整的 10 行“旧”文件和一个较小的(

【讨论】:

  • 感谢您的宝贵时间。使用seekp 似乎只会一遍又一遍地用新数据替换第一行
  • 如果您在每行而不是每 10 行之后调用 seekp(),​​我希望看到这种行为。
  • 你是绝对正确的。非常感谢@Jeremy!