C++设置光标在文件中的确切行位置

3

我想在C++中从文件中读取一行(但不是第一行)。有没有聪明的方法来完成这个任务?现在我正在考虑使用getline()并在循环中继续,但似乎这不是最优的方法?有什么建议吗? 问候


你可以使用fseek()函数,你可以在这里获取帮助:http://www.cplusplus.com/reference/cstdio/fseek/ - IAmBlake
如果行的长度是可变的,那么除了读取行直到找到所需的行之外,没有其他方法。如果它们的长度是固定的,则可以寻找到 linenumber * linelength,其中 linelength 必须包括换行符。 - Unimportant
抱歉,您必须逐行读取。没有系统级别的方法可以一次扫描一行。如果必要且可行,您可以为文件编写索引,并记录已知换行符的字节位置。当然,如果不知道您真正想要做什么,我们无法给出正确的答案。 - Lightness Races in Orbit
1个回答

3

文本行被称为“可变长度记录”,由于它们的长度不固定,因此您无法轻松地定位到文件中的某一行。

一种方法是维护一个文件位置的std::vector。遍历文件,读取每一行并记录其位置:

std::vector<std::streampos> text_line_positions;
// The first line starts at position 0:
text_line_positions.push_back(0);

std::string text;
while (std::getline(my_text_file, text))
{
  const std::streampos position = my_text_file.tellg();
  text_line_positions.push_back(position);
}

您可以从向量中检索文件位置:

const std::streampos line_start = text_line_positions[line_number];

编辑1:文本向量
一种更优化的方法是将每行文本读入一个std::vector中:

std::vector<std::string> file_text;
std::string text;
while (std::getline(my_file, text))
{
  file_text.push_back(text);
}

以上方法的缺点之一是需要足够的内存来容纳文件。
然而,由于不需要再次读取文件,因此访问时间很快。

与所有优化一样,存在妥协。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接