Qt 快速读取大文件最后一行内容

0. 前言

有时候根据需求,需要读取文本的最后一行内容。
如果是小文本,按照顺序读,然后取最后一行就Ok;但如果是大文本,即使是放到线程里跑,读取到最后一行也会有延迟,比较耗时。

1. 解决方案

查看QFile帮助手册,其有

bool seek(qint64 pos);

意思就是查找设备中的位置。成功时返回true;否则返回false。
因此可以,从后往前一个位置一个位置查,如果包含换行符,就说明获取到了最后一行。
代码如下:

    QFile file("C:\\Users\\Desktop\\in.txt");
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
   
        QTextStream in(&file);
        in.setCodec(QTextCodec::codecForName("UTF-8"));
        int nSize = file.size();
        // size == 0 时,返回
        if(nSize < 1)
        {
   
            qDebug().noquote() << "无数据.";
            return;
        }
        // size == 1 时,跳出
        int nTmp = 0;
        while(!in.atEnd()){
   
            in.readLine();
            ++nTmp;
            if(nTmp > 1)
            {
   
                break;
            }
        }
        // 获取1行的内容
        if(nTmp < 2)
        {
   
            in.seek(0); // 将光标移到文本开始位置
            qDebug().noquote() << "读取第一行 : " << in.readLine();
            return;
        }
        // size > 1时,从后往前读,当读到包含"\r\n"时,seek位置加上"\r\n"的长度,这样位置调到最后一行开始,读取单行
        // 不同系统可能行分割不一样,Windows平台下是"\r\n"
        int nIndex = 1;
        in.seek(nSize - nIndex);
        while(!in.readAll().contains("\r\n"))
        {
   
            ++nIndex;
            in.seek(nSize - nIndex);
        }
        in.seek(nSize - nIndex + 2); // 将光标移到最后一行开始
        qDebug().noquote() << "读取最后一行 : " << in.readLine();
    }

分为三种情况:

  • 当文本为空时,提示或返回
  • 当文本只有一行时,输出首行
  • 当文本 > 一行时,执行操作

2. 结果

愿你有个喜出望外的一月

相关推荐

  1. Qt 快速读取文件最后内容

    2024-01-10 07:10:05       46 阅读
  2. 如何读取文件最后并解析

    2024-01-10 07:10:05       32 阅读
  3. QT-file无法读取text文本中多内容

    2024-01-10 07:10:05       14 阅读
  4. 记录次 Linux/Android 读取文件失败

    2024-01-10 07:10:05       51 阅读
  5. Qt】xml文件节点读取

    2024-01-10 07:10:05       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-10 07:10:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-10 07:10:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-10 07:10:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-10 07:10:05       20 阅读

热门阅读

  1. 2_单列模式_饿汉式单例模式

    2024-01-10 07:10:05       39 阅读
  2. 单例模式的模板

    2024-01-10 07:10:05       40 阅读
  3. ESP32-WIFI(Arduino)

    2024-01-10 07:10:05       41 阅读
  4. macOS系统安装PHP7教程

    2024-01-10 07:10:05       36 阅读
  5. 前端常用的设计模式

    2024-01-10 07:10:05       40 阅读
  6. FreeRTOS——中断管理

    2024-01-10 07:10:05       44 阅读