我想阅读一个大文本文件的最后10行。 通常我循环遍历文件并获取最后10行。 请告诉我,还有其他方法可以更快地阅读最后一行。
感谢。
答案 0 :(得分:1)
您可以使用(CStdioFile::GetLength
)(继承自CFile
)获取文件的长度(以字节为单位):
http://msdn.microsoft.com/en-US/library/b569d0t4(v=VS.80).aspx
您可以使用CStdioFile::Seek
跳转到任意偏移量:
http://msdn.microsoft.com/en-US/library/8c5ccz0x(v=VS.80).aspx
如果线长是固定的,那么读取最后N行是一个非常容易的问题。但是没有“向后读”操作,并且在一般情况下,您不知道任意文本文件中的行有多长。 (如果你想更快地做到这一点,你可以构建和维护一个跟踪它的索引文件。)
请注意,一次寻找和阅读一个角色可能效率低下。完全如何低效取决于几个因素。虽然在操作系统级别缓冲可能使它不像每次重新回到磁盘时那样糟糕,但每次寻找时都会有开销,每次调用时读操作。
所以你可能最好选择一个缓冲区大小,并逐步阅读块。作为一个有用的强烈迹象,请参阅UNIX的一些名为tail
的源代码。它获取文件的最后N行,虽然它是用C语言编写的,但它可能会给你一些见解:
http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c#n477
答案 1 :(得分:0)
在二进制文件中,您(通常)具有固定的记录长度。在文本文件中,一种可能性是将文本行视为用于划分文件内容的记录。不幸的是,常规文本文件中的行不是固定大小的,因此您不能依赖公式,例如:
lastTenthLine = ( LengthOfFile / LengthOfLine ) - 10;
我能想到的唯一方法是将读指针移动到文件的末尾。开始向后阅读,每次一个字符,并计算你通过'\ n'字符的次数。一旦计算了十次,就可以返回下一个焦点位置。
(请注意,根据您使用的文件的来源(OS),您可能会出现“结束行问题”。由于您正在使用MFC,因此只要有问题,就不会有任何问题。使用的文件是在Windows中生成的
由于我认为这是作业,我不会发布代码。您在这里有关于MFC的文档,解释了如何处理文件。您需要CFile::Read
和CFile::Seek
方法(除了打开和关闭)。请注意,CFile
是CStdioClass
的父类。
http://msdn.microsoft.com/en-us/library/ey6xh9bk(v=vs.80).aspx
希望这有帮助。