C++ tail-n的高效实现

C++ tail-n的高效实现,c++,C++,可能重复: 我的一个朋友被问到他将如何实现tail-n。 为了清楚起见,我们需要打印指定文件的最后n行 我考虑使用一个由n个字符串组成的数组,并以循环方式覆盖它们。 但是,如果给定一个10gb文件,这种方法根本无法扩展 有更好的方法吗?内存映射文件,从末尾迭代查找行尾n次,从该点到文件末尾写入标准输出 如果不映射整个文件,而只是映射最后的xKB内存(比如几个内存页)并在那里查找,则可能会使解决方案复杂化。如果没有足够的线,那么内存将映射一个更大的区域,直到得到所需的内容。您可以使用一些启发式方

可能重复:

我的一个朋友被问到他将如何实现
tail-n
。 为了清楚起见,我们需要打印指定文件的最后
n

我考虑使用一个由n个字符串组成的数组,并以循环方式覆盖它们。 但是,如果给定一个
10gb
文件,这种方法根本无法扩展


有更好的方法吗?

内存映射文件,从末尾迭代查找行尾
n
次,从该点到文件末尾写入标准输出

如果不映射整个文件,而只是映射最后的xKB内存(比如几个内存页)并在那里查找,则可能会使解决方案复杂化。如果没有足够的线,那么内存将映射一个更大的区域,直到得到所需的内容。您可以使用一些启发式方法来猜测要映射多少内存(粗略估计为每行1kb)。不过我不会真的这么做。

毫无疑问,这要看情况而定。考虑到文件的大小应该是已知的,并且考虑到一个合理的文件操作库,该库可以“搜索”到一个非常大的文件的末尾,而无需依次遍历每个字节或搅动虚拟内存,您可以简单地从末尾向后扫描计数换行符

当您处理这么大的文件时,对于
n
接近于多GB文件中的行数的退化情况,您会怎么做?在临时字符串中存储内容也不会扩展