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读取大文件最后一行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论