向后搜索Qt5 / C ++中的文本文件(尾部文件)

时间:2014-09-13 13:00:08

标签: c++ qt file memory-mapped-files

我需要创建Qt5 / C ++相当于' tail -5 myfile' (没有使用shell命令。我发现了一些stackoverflow引用,在文件结束之前寻找X字节,然后向前阅读,但我希望有更好的东西。

是否有更好/更快的方式使用可用的Qt函数,或者可能是文件的内存映射(部分)? (有问题的文件可能很大,所以这必须具有相对内存效率)

1 个答案:

答案 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毫秒都是(可能)良好的结果。