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

TSG*_*TSG 1 c++ qt file memory-mapped-files

我需要创建Qt5 / C ++的“ tail -5 myfile”等效项(不使用shell命令。我发现了几个stackoverflow引用,它们在文件结尾之前先查找X字节,然后再向前读取,但我希望有一些东西更好。

有可用的Qt功能更好的/更快的方法,还是文件的内存映射(一部分)?(有问题的文件可能很大,所以这必须相对提高内存效率)

Che*_*byl 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();
}
Run Code Online (Sandbox Code Playgroud)

性能:

我的下一个输出与file ~11 Gb

size  11768585585 
"???G?t??" 
reading took 23 ms 
Run Code Online (Sandbox Code Playgroud)

程序没有增加RAM使用率。对于小文件,(~1Gb)我有0ms。我认为这是正常速度。

编辑:

接下来是用Qt做诸如tail实用程序之类的方法。我不认为这种方式非常正确并且性能很高,但是它比读取所有文件并进行解析要好。我们无法使用某种魔术readLineFromEnd()方法从头开始读取文件,因此请尝试使用next:

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();
}
Run Code Online (Sandbox Code Playgroud)

8Kbtxt文件的输出:

reading took 2 ms . 
Run Code Online (Sandbox Code Playgroud)

~8Mbtxt文件的输出(它是一个日志文件):

reading took 1 ms 
Run Code Online (Sandbox Code Playgroud)

是的,它的性能较低,但这是复杂的任务。有趣的是,需要多少时间使用tail实用程序来执行此操作,但是无论如何,1毫秒和2毫秒都是(也许)好的结果。