【发布时间】: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.txt,log1.txt等,跟踪当前文件大小,一旦文件变得太满,将“索引”增加一回到@ 987654328@,如果您已达到某个限制。这样做的逻辑并不太短,但应该相当直接地实现...... -
使用内存映射文件。 (例如github.com/mandreyel/mio)。您可以像在内存中一样管理文件。