Ifstream如何使用c++从特定行开始读行
ifstream how to start read line from a particular line using c++
我使用ifstream
来解析c++代码中的文件。我不能使用seekg()
和tellg()
在代码的特定行中跳转。
特别地,我想用getLine方法从文件的特定位置读取一行。在先前迭代中保存的位置。
您只需跳过所需的行数。最好的方法是使用std::istream::ignore
忽略字符串。for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){
if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('n'))){
//just skipping the line
} else {
// todo: handle the error
}
}
第一个参数是要提取的最大字符数。如果正好是numeric_limits::max(),则没有限制。
您应该使用is而不是std::getline,因为性能更好。
似乎没有特定的c++函数,如"seekline",以满足您的需求,我看到两种方法来解决这个任务:
- 初值你可以用空格展开文本文件中的每一行,以达到定长L。然后,要查找所需行N,只需使用
seekg
L * N偏移 - 这种方法比较复杂。您可以创建一个辅助二进制文件文件,它的每个字节将保持源代码的每行长度文件。这个辅助文件是一种数据库。接下来,你必须在初始化阶段将这个二进制文件加载到程序的数组中。a的偏移量textfile中的所需行应计算为第一个N数组的和元素。当然,需要同时更新辅助文件和源文件。
如果文本文件符合其大小要求,则第一种情况更有效。第二种情况对于长文本文件和稀有的编辑操作具有最佳性能。
相关文章:
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 如何使用 picojson.h 在 c++ 中从头开始创建 json 对象
- 如何修复我的编码,刚开始使用字符串
- 如何使用 CTIME/Chrono Libarey 将开始时间与系统时钟进行比较
- 如何使用Chrono或ctime libaray输入设置的开始和结束时间
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- 是否可以在基于范围的 for 循环中使用模板化的开始/结束方法
- 从头开始为使用Qt的应用程序制作简约的构建文件
- 使用递归从尾部开始反转链表
- 为什么 std::variant 使用开始和结束迭代器进行编译?
- 如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始
- 构建大型无序集,并在开始时使用所有可用数据
- 使用 std::move 在开始时插入矢量的中间元素不起作用
- 从两端开始浏览列表,然后使用迭代器在中间停止
- 为什么我们不能在模板专业化的开始/中间使用可变参数模板(以及如何模拟)?
- C 指针数组使用STL开始和结束
- 如何使用迭代器实现从序列的中间到开始的循环
- 在Ubuntu上使用C 中的pthreads时.主线程范围从哪里开始和结束
- 在开始使用 ISOCPP.net C++ 构建 Windows 时遇到问题 (Nuwen)