Qt快速讀取大文件最后一行內(nèi)容解決方案
0. 前言
有時(shí)候根據(jù)需求,需要讀取文本的最后一行內(nèi)容。
如果是小文本,按照順序讀,然后取最后一行就Ok;但如果是大文本,即使是放到線(xiàn)程里跑,讀取到最后一行也會(huì)有延遲,比較耗時(shí)。
1. 解決方案
查看QFile幫助手冊(cè),其有
bool seek(qint64 pos);
意思就是查找設(shè)備中的位置。成功時(shí)返回true;否則返回false。
因此可以,從后往前一個(gè)位置一個(gè)位置查,如果包含換行符,就說(shuō)明獲取到了最后一行。
代碼如下:
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 時(shí),返回
if(nSize < 1)
{
qDebug().noquote() << "無(wú)數(shù)據(jù).";
return;
}
// size == 1 時(shí),跳出
int nTmp = 0;
while(!in.atEnd()){
in.readLine();
++nTmp;
if(nTmp > 1)
{
break;
}
}
// 獲取1行的內(nèi)容
if(nTmp < 2)
{
in.seek(0); // 將光標(biāo)移到文本開(kāi)始位置
qDebug().noquote() << "讀取第一行 : " << in.readLine();
return;
}
// size > 1時(shí),從后往前讀,當(dāng)讀到包含"\r\n"時(shí),seek位置加上"\r\n"的長(zhǎng)度,這樣位置調(diào)到最后一行開(kāi)始,讀取單行
// 不同系統(tǒng)可能行分割不一樣,Windows平臺(tái)下是"\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); // 將光標(biāo)移到最后一行開(kāi)始
qDebug().noquote() << "讀取最后一行 : " << in.readLine();
}
分為三種情況:
- 當(dāng)文本為空時(shí),提示或返回
- 當(dāng)文本只有一行時(shí),輸出首行
- 當(dāng)文本 > 一行時(shí),執(zhí)行操作
2. 結(jié)果
愿你有個(gè)喜出望外的一月。
補(bǔ)充:qt文件末尾空行讀取不完的問(wèn)題
QString line;
QTextStream in(&file1); //用文件構(gòu)造流
while(1)
{
line=in.readLine();//循環(huán)讀取下行
if(!line.isNull())//字符串有內(nèi)容,換行符也是內(nèi)容
{
lis.append(line);
}
else
break;
}這樣就會(huì)導(dǎo)致文件最后一行如果剛好是空行,就讀取不出來(lái),因?yàn)槭强兆址ǘ液竺鏇](méi)有換行符了),讀不進(jìn)來(lái),如果是文件中間的空行,雖然也是空字符串,但是這一行末尾是有換行符的(就不是空字符串了),是可以繼續(xù)讀的,就是這個(gè)原因?qū)е碌摹?/p>
解決方法:
QTextStream in(&file1); //用文件構(gòu)造流
lis = in.readAll().split("\n");總結(jié)
到此這篇關(guān)于Qt快速讀取大文件最后一行內(nèi)容解決方案的文章就介紹到這了,更多相關(guān)Qt讀取大文件最后一行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解c++中signal信號(hào)攜帶數(shù)據(jù)的接收與發(fā)送
這篇文章主要為大家詳細(xì)介紹了c++中signal信號(hào)攜帶數(shù)據(jù)的接收與發(fā)送的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之自定義函數(shù)
自定義函數(shù): 必須直接或間接在main中調(diào)用,否則該自定義函數(shù)不會(huì)被執(zhí)行。 返回值類(lèi)型 函數(shù)名(參數(shù)類(lèi)型 參數(shù)名,參數(shù)類(lèi)型 參數(shù)名...)2017-10-10
C++實(shí)現(xiàn)簡(jiǎn)單職工信息管理系統(tǒng)
本文給大家分享的是使用C++實(shí)現(xiàn)簡(jiǎn)單的職工信息管理系統(tǒng)的代碼,本系統(tǒng)采用了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,所有的方法均以類(lèi)為基礎(chǔ),感興趣的小伙伴們可以參考一下2015-08-08
簡(jiǎn)單了解C語(yǔ)言中主線(xiàn)程退出對(duì)子線(xiàn)程的影響
這篇文章主要介紹了簡(jiǎn)單了解C語(yǔ)言中主線(xiàn)程退出對(duì)子線(xiàn)程的影響,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
c語(yǔ)言連接mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
C語(yǔ)言連接mysql數(shù)據(jù)庫(kù),需要相應(yīng)的頭文件和lib文件,如果你安裝Mysql數(shù)據(jù)庫(kù),會(huì)在安裝目錄下找到這些庫(kù)文件,如果沒(méi)有安裝,也可以在網(wǎng)上找到2012-05-05
C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
探討:C++實(shí)現(xiàn)鏈?zhǔn)蕉鏄?shù)(用非遞歸方式先序,中序,后序遍歷二叉樹(shù))
本篇文章是對(duì)用C++實(shí)現(xiàn)鏈?zhǔn)蕉鏄?shù)(用非遞歸方式先序,中序,后序遍歷二叉樹(shù))的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

