gpt4 book ai didi

c++ - 在 Qt5/C++ 中向后查找文本文件(tail a file)

转载 作者:行者123 更新时间:2023-11-30 01:16:49 24 4
gpt4 key购买 nike

我需要创建“tail -5 myfile”的 Qt5/C++ 等价物(不使用 shell 命令。我发现了几个 stackoverflow 引用文件以在文件末尾之前寻找 X 字节然后向前阅读,但我希望有更好的东西。

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

最佳答案

正如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() 方法从头到尾读取文件,因此请尝试使用 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();
}

8Kb txt 文件的输出:

reading took 2 ms . 

~8Mb txt 文件的输出(这是一个日志文件):

reading took 1 ms 

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

关于c++ - 在 Qt5/C++ 中向后查找文本文件(tail a file),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25823484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com