Qt快速讀取大文件最后一行內(nèi)容解決方案
0. 前言
有時(shí)候根據(jù)需求,需要讀取文本的最后一行內(nèi)容。
如果是小文本,按照順序讀,然后取最后一行就Ok;但如果是大文本,即使是放到線程里跑,讀取到最后一行也會(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語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字游戲
大家好,本篇文章主要講的是C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字游戲,感興趣的同學(xué)趕快來(lái)看一看了吧,對(duì)你有幫助的話記得收藏一下2022-01-01Qt5實(shí)現(xiàn)文本編輯器(附詳細(xì)代碼)
QT是一個(gè)跨平臺(tái)的GUI開(kāi)發(fā)框架,我使用的QT5 C++版本的,本文主要介紹了Qt5實(shí)現(xiàn)文本編輯器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C語(yǔ)言編程中生成隨機(jī)數(shù)的入門(mén)教程
這篇文章主要介紹了C語(yǔ)言編程中生成隨機(jī)數(shù)的入門(mén)教程,包括利用rand()函數(shù)來(lái)編寫(xiě)隨機(jī)數(shù)生成器的示例,要的朋友可以參考下2015-12-12C語(yǔ)言學(xué)習(xí)基礎(chǔ)知識(shí)分享
這篇文章主要介紹了C語(yǔ)言學(xué)習(xí)基礎(chǔ)知識(shí)分享的相關(guān)資料,需要的朋友可以參考下2023-01-01