【发布时间】:2009-05-12 06:20:52
【问题描述】:
我有一个相对简单的问题。假设我有一个文件,但我只想访问文件的第 X 行直到第 Y 行,这样做最简单的方法是什么?
我知道我可以逐行阅读并保持计数,直到达到我真正需要的行,但是有更好更优雅的解决方案吗?
谢谢。
【问题讨论】:
我有一个相对简单的问题。假设我有一个文件,但我只想访问文件的第 X 行直到第 Y 行,这样做最简单的方法是什么?
我知道我可以逐行阅读并保持计数,直到达到我真正需要的行,但是有更好更优雅的解决方案吗?
谢谢。
【问题讨论】:
在 C++ 中,不,不是真的(嗯,不是在我熟悉的任何语言中,真的)。
你必须从文件的开头开始,这样你才能确定第 X 行的开始位置(除非它是一个固定记录长度的文件,但对于文本来说不太可能)。
同样,您必须这样做,直到找到您感兴趣的最后一行。
如果您害怕缓冲区溢出漏洞,您可以读取字符而不是行,或者您可以读取固定大小的块并计算换行符以提高速度,但这一切都归结为读取和检查每个字符(通过您的代码显式或隐式语言库)来计算换行符。
【讨论】:
您可以使用 istream::ignore() 来避免缓冲不需要的输入。
bool skip_lines(std::istream &is, std::streamsize n)
{
while(is.good() && n--) {
is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return is.good();
}
【讨论】:
搜索 \n X 次,开始“阅读”(无论需要什么处理),直到到达 Y-X \n 或 EOF。假设 unix 风格的新行。
【讨论】:
由于您必须确保每行内的结束行字符才能计算行数,因此您仍然需要遍历文件。我能想到的唯一优化不是逐行读取文件,而是缓冲它,然后迭代计算行数。
【讨论】:
使用 C 或 C++,有一些函数可用于跳过文件中指定数量的字节(在 stdio 中使用 fseek,在 istreams 和 ostreams 中使用 seekp)。但是,您不能指定给定的行数,因为每行可能有可变数量的字符,因此无法计算正确的偏移量。文件不是每行占据一个“行”的某种数组:您宁愿将其视为连续的内存空间(这里不是在谈论硬件......)
【讨论】: