Qt快速读取大文件最后一行内容解决方案

 更新时间:2024年01月10日 16:17:11   作者:FreeLikeTheWind.  
这篇文章主要给大家介绍了关于Qt如何快速读取大文件最后一行内容的解决方案,文中通过代码介绍的非常详细,对大家学习或者使用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. 结果

愿你有个喜出望外的一月。

补充:qt文件末尾空行读取不完的问题

   QString line;
        QTextStream in(&file1);  //用文件构造流
        
        while(1)
        {
            line=in.readLine();//循环读取下行
            if(!line.isNull())//字符串有内容,换行符也是内容
            {
                lis.append(line);
            }
            else
                break;
        }

这样就会导致文件最后一行如果刚好是空行,就读取不出来,因为是空字符串(而且后面没有换行符了),读不进来,如果是文件中间的空行,虽然也是空字符串,但是这一行末尾是有换行符的(就不是空字符串了),是可以继续读的,就是这个原因导致的。

解决方法:

        QTextStream in(&file1);  //用文件构造流
        lis = in.readAll().split("\n");

总结

到此这篇关于Qt快速读取大文件最后一行内容解决方案的文章就介绍到这了,更多相关Qt读取大文件最后一行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C++的模板中typename关键字的用法

    详解C++的模板中typename关键字的用法

    在C++的Template中我们经常可以见到使用typename来定义类型名称,更加具体的我们就在接下来为大家详解C++的模板中typename关键字的用法,需要的朋友可以参考下:
    2016-06-06
  • 深入理解QT多线程编程

    深入理解QT多线程编程

    本文主要介绍了QT多线程编程的深入理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • C语言直接选择排序算法详解

    C语言直接选择排序算法详解

    直接选择排序就是遍历整个数组,每遍历一遍的目的是找出该数组中的最大数和最小数对应的下标,然后将最小数和数组的第一个数进行交换,最大数和数组的最后一个数进行交换,然后缩小范围再次遍历
    2022-08-08
  • C语言代码实现猜数字游戏

    C语言代码实现猜数字游戏

    大家好,本篇文章主要讲的是C语言代码实现猜数字游戏,感兴趣的同学赶快来看一看了吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Qt5实现文本编辑器(附详细代码)

    Qt5实现文本编辑器(附详细代码)

    QT是一个跨平台的GUI开发框架,我使用的QT5 C++版本的,本文主要介绍了Qt5实现文本编辑器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++ Boost Xpressive示例分析使用

    C++ Boost Xpressive示例分析使用

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言学生管理系统源码分享

    C语言学生管理系统源码分享

    这篇文章主要为大家分享了C语言学生管理系统的源码,帮助大家学习结构体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • C语言编程中生成随机数的入门教程

    C语言编程中生成随机数的入门教程

    这篇文章主要介绍了C语言编程中生成随机数的入门教程,包括利用rand()函数来编写随机数生成器的示例,要的朋友可以参考下
    2015-12-12
  • C语言中反斜杠的作用及说明

    C语言中反斜杠的作用及说明

    这篇文章主要介绍了C语言中反斜杠的作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言学习基础知识分享

    C语言学习基础知识分享

    这篇文章主要介绍了C语言学习基础知识分享的相关资料,需要的朋友可以参考下
    2023-01-01

最新评论