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 偏移量。
- 这个方法比较复杂。您可以创建一个辅助二进制文件
文件,它的每个字节将保持每行源代码的长度
文件。这个辅助文件是一种数据库。接下来,你必须
在初始化阶段将此二进制文件加载到程序中的数组中。的偏移量
文本文件中所需的行应计算为第一个 N 数组的总和
元素。当然,需要同时更新一个辅助文件和源文件。
如果文本文件符合其大小要求,第一种情况会更有效。第二种情况为长文本文件和罕见的编辑操作带来最佳性能。
我正在使用 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 偏移量。 - 这个方法比较复杂。您可以创建一个辅助二进制文件 文件,它的每个字节将保持每行源代码的长度 文件。这个辅助文件是一种数据库。接下来,你必须 在初始化阶段将此二进制文件加载到程序中的数组中。的偏移量 文本文件中所需的行应计算为第一个 N 数组的总和 元素。当然,需要同时更新一个辅助文件和源文件。
如果文本文件符合其大小要求,第一种情况会更有效。第二种情况为长文本文件和罕见的编辑操作带来最佳性能。