我有一个相对简单的问题。假设我有一个文件,但我只想访问文件的第X行,直到第Y行,最简单的方法是什么?
我知道我可以逐行阅读,直到我达到我真正需要的线条,但是有更好的解决方案吗?
感谢。
答案 0 :(得分:5)
在C ++中,不,不是真的(好吧,不是我熟悉的任何语言)。
你必须从文件的开头开始,这样你才能知道第X行的开始位置(除非它是一个固定记录长度的文件,但文本不太可能)。
同样,你必须这样做,直到找到你感兴趣的最后一行。
如果您害怕缓冲区溢出攻击,您可以读取字符而不是行,或者您可以读取固定大小的块并计算换行速度,但这一切都归结为读取和检查每个字符(通过您的代码显式地或语言库隐含地计算新行。
答案 1 :(得分:4)
您可以使用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();
}
答案 2 :(得分:2)
搜索\ n X次,开始'读'(无论需要什么处理),直到你到达Y-X \ n或EOF。假设unix风格的新行。
答案 3 :(得分:2)
由于您必须确保每行内的结束行字符才能计算行数,因此您仍需要迭代您的文件。我能想到的唯一优化是不是逐行读取文件,而是缓冲它然后迭代计算行。
答案 4 :(得分:0)
使用C或C ++,可以使用一些函数来跳过文件中指定数量的字节(stdio中的fseek和istreams和ostreams的seekp)。但是,您不能指定给定的行数,因为每行可能具有可变数量的字符,因此无法计算正确的偏移量。一个文件不是某种类型的数组,其中每一行都占据一个“行”:你宁愿把它看作一个连续的存储空间(这里没有说硬件......)