首页 > 其他分享 >Qt 快速读取大文件最后一行内容

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

时间:2024-01-09 21:33:03浏览次数:26  
标签:Qt seek 一行 nSize file 文本 nIndex 读取

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,seek,一行,nSize,file,文本,nIndex,读取
From: https://blog.51cto.com/u_16417016/9166073

相关文章

  • python通过RS485、Modbus协议读取/修改仪表数据
    目标python通过RS485的Modbus协议读取仪表相应的寄存器数据。准备工作软件安装第三方库:serial、pyserial、modbus_tkpipinstallserialpipinstallpyserialpipinstallmodbus_tk硬件一根USB转RS485的转接线(电脑本身不带RS485接口时需要)一个带Modbus通讯的仪表(例子中使用的时一......
  • MQTT服务器连接不上的问题
    问题描述环境:阿里云服务器Ubuntu22.04.3LTS,安装mosquitto后,在虚拟机端订阅消息出现报错(以前用阿里云Ubuntu20.04LTS的服务器装上就能用),以下服务器ip是我乱填的mosquitto_sub-t/iotstuff-h129.25.125.124-p1883Error:Connectionrefused解决办法查看服务器的端口占......
  • Qt读取文件对比:每次获取自定义的长度和使用系统的API,耗时对比
    0.前言在编程过程中,经常遇到文件读写操作,太频繁了。每次也都写的不一样。突发奇想,想测试下几种不同的读取文件的效率。测试以下三种方式读取文件效率:自定义读取文件耗时使用QFile类API读取文件耗时使用QTextStream类API读取文件耗时在测试前,说一下使用到的知识点。1.Qt......
  • stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原
    stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)文章目录stm32学习总结:6、Proteus8+STM32CubeMX+MDK仿真蜂鸣器及ADC读取电压(Proteus标签整理原理图)一、前言二、资料收集三、STM32CubeMX配置按键及蜂鸣器连接口1、按键及LED的IO口配置2、......
  • java: 从HBase中读取数据
    一、添加依赖:<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency>......
  • 如何写一个python脚本读取控制台类型的程序上面的文本
     在Python中,你可以使用`input()`函数来读取控制台输入的文本。这个函数会等待用户在控制台输入文本,并将其作为字符串返回给你的程序。下面是一个示例,演示了如何编写一个Python脚本来读取控制台输入的文本:```python#读取控制台输入的文本text=input("请输入文本:")print("你......
  • FAQ001 读取INI文件的配置项
    要读取INI文件中的配置项,你可以使用System.IO.File类来读取文件,然后使用System.Text.RegularExpressions.Regex类来搜索字符串并提取所需的值。下面是一个基本的函数示例,它根据传入的文件名和配置项名返回对应的配置值。usingSystem.IO;usingSystem.Text.RegularExpress......
  • Qt生成动态库和使用动态库
    一、动态库的生成第一步.新建项目——库——C++Library——点击选择按钮第二步.填写名称——新建路径——点击下一步按钮第三步:选择Buildsystem:默认的qmake即可——点击下一步按钮第四步:设置库的类型默认的SharedLibrary即可——设置Qt module选择需要的模块——其他也设置为......
  • STM32MP157D-DK1 Qt程序交叉编译与运行测试
    上篇文章介绍了STM32MP157D-DK1开发板Qt镜像的构建,通过在Ubuntu中重新编译带有Qt功能的系统来实现。本篇在上篇的基础上,继续搭建Qt的交叉编译环境,实现Qt程序在Ubuntu中编译,在STM32MP157板子中运行。1编译安装SDK在上篇编译系统镜像的基础上,继续编译和安装SDK。1.1编译SDK执行如下......
  • 安装MySQL数据库及QT添加数据库驱动连接使用
    1.下载官方地址MySQLCommunityserver8.2.0innovation:MySQL社区版的服务器软件,目前最新版本是8.2.0SelectVersion:选择你需要下载的版本号SelectOperatingSystem:选择操作系统,支持安装的操作系统如下Windows(x86,64bit),MSIInstaller(MSI=microsoftinstaller):推荐选择W......