c++:如何在文件中写入时导航到文件中的特定行
c++ :How to navigate to a particular line in a file while writing in a file?
程序(在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;
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- 如何在 Xcode 项目导航器中显示.txt文件
- c++:如何在文件中写入时导航到文件中的特定行
- CMake Xcode 在问题导航器中使用了错误的文件
- C++编程:导航到用户文件以保存每个用户的应用程序数据
- 如何导航文件夹以读取图像
- Xcode-在项目导航器中创建新的C++文件-Order.h和.cpp-Order
- 级联导航窗格:连接到另一个qml文件的对象信号