c++:如何在文件中写入时导航到文件中的特定行

c++ :How to navigate to a particular line in a file while writing in a file?

本文关键字:文件 导航 c++      更新时间:2023-10-16

程序(在c++中)必须按顺序在文件中写入文本。但有时需要在特定的行号上写一些东西。有没有一种方法可以在不遍历整个文件的情况下导航到特定的行号?如果有,它的复杂性是什么?有类似fseek的东西吗?

除非你的文件是固定长度的记录,否则没有快速的方法来定位一行。

对于可变长度的文本行,您必须读取每个字符以确定它是否是行尾字符。如果是,则增加行号。

如果您需要经常按行号访问行,则可能需要构建<行号,文件位置>记录。您只需要执行一次。

编辑1:
您可以在创建文件时构建行位置表。在编写文本行之前,请先读取并存储文件位置。

顺便说一句,您可以覆盖文件中的文本,但不能在文件中插入文本(除了追加)。要插入文本,必须先将所有原始数据写入新文件,再写入新文本,然后再写入所有剩余文本。

典型的原始文本文件的格式是描述每一行的字节序列,然后是行结束标记(在某些系统中为一个字节,在其他系统中为两个字节)。然后下一行立即开始。

文件通常以结束线标记结束。

如果您的文件是基于此进行格式化的,则没有快速的方法可以找到一行,或者用除字节数完全相同的行之外的任何内容替换它。

这种格式的优点是有很多工具可以读取它

然而,这不一定是你的格式。一种很容易找到行并同样替换行的格式是非常可写的。这不会是琐碎的,但也不是棘手的。

要想轻松接近,请抓住STXXL。遗憾的是,我在那里没有看到一个随机访问的廉价中间插入-删除容器(就像一个在每个节点存储子树大小的自平衡树)。但也许有。

您需要GotoLine()函数。

例如,您有一个dummy.txt文件,并且希望导航到第10行。所以你可以直接做

fstream file("dummy.txt");
GotoLine(file, 10);
ofstream myfile("foo.txt");
int lineNumber = 123;
for(int i=0;i<lineNumber-1;i++) myfile << "n";
myfile << "Here I am on line number " << lineNumber << endl;