如何在一个流文件中始终有N行实时数据

  • 本文关键字:数据 实时 文件 一个 c++ linux
  • 更新时间 :
  • 英文 :


我想使用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++代码(我知道这很傻)。"实时数据"部分原因是myfile <<"hey"线。

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

你可以通过输入

获得你想要的行为
myfileo.seekp(0, std::ios_base::beg);

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

我说"sort of",是因为除非所有文本行长度完全相同,否则每当前10行比新10行长时,就会在文件末尾留下一些剩余的字节。也许这对你的目的是可以接受的,我不知道。

另一种可能的方法是在10行之后myfileo.close()你的ofstream和myfileo.open()一个不同名称的新文件,并开始写入该文件。然后,当新文件"满"时,删除旧文件,并重复此过程。这样磁盘上就会有两个文件,一个完整的10行old文件。文件和一个较小的(<10行)"正在进行"文件;这样做的好处是两个文件在任何时候都是格式良好的。

最新更新