我需要创建Qt5 / C ++相当于' tail -5 myfile' (没有使用shell命令。我发现了一些stackoverflow引用,在文件结束之前寻找X字节,然后向前阅读,但我希望有更好的东西。
是否有更好/更快的方式使用可用的Qt函数,或者可能是文件的内存映射(部分)? (有问题的文件可能很大,所以这必须具有相对内存效率)
答案 0 :(得分:5)
如sashoalm
所述,请使用seek()
方法。例如:
QElapsedTimer tmr;
tmr.start();
QFile file("path");
if(file.open(QIODevice::ReadOnly))
{
qint64 num = 10;
qint64 fileSize = file.size();
qDebug() << fileSize;
file.seek(fileSize - num);
qDebug() << file.read(num);
qDebug() <<"reading took" << tmr.elapsed()<< "ms";
file.close();
}
性能比较:
我有文件~11 Gb
的下一个输出。
size 11768585585
"???G?t??"
reading took 23 ms
程序没有增加RAM
使用率。对于小文件(~1Gb)
,我有0ms
。我认为这是正常的速度。
编辑:
接下来可以使用Qt执行类似tail实用程序的方法。我不相信这种方式非常正确且性能很好,但它比读取所有文件并解析它更好。我们无法从末尾读取文件以使用某种神奇的readLineFromEnd()
方法开始,因此请尝试使用下一个:
QElapsedTimer tmr;
tmr.start();
QFile file("path");
if(file.open(QIODevice::ReadOnly))
{
file.seek(file.size()-1);
int count = 0;
int lines = 5;
while ( (count < lines) && (file.pos() > 0) )
{
QString ch = file.read(1);
file.seek(file.pos()-2);
if (ch == "\n")
count++;
}
qDebug() << file.readAll();
qDebug() <<"reading took" << tmr.elapsed()<< " ms";
file.close();
}
8Kb
txt文件的输出:
reading took 2 ms .
~8Mb
txt文件的输出(它是一个日志文件):
reading took 1 ms
是的,它的性能较低,但这是一项复杂的任务。有趣的是,尾部实用程序需要多长时间来执行此操作,但无论如何1和2毫秒都是(可能)良好的结果。