0. 前言
有时候根据需求,需要读取文本的最后一行内容。
如果是小文本,按照顺序读,然后取最后一行就Ok;但如果是大文本,即使是放到线程里跑,读取到最后一行也会有延迟,比较耗时。
1. 解决方案
查看QFile
帮助手册,其有
cpp
bool seek(qint64 pos);
意思就是查找设备中的位置。成功时返回true;否则返回false。
因此可以,从后往前一个位置一个位置查,如果包含换行符,就说明获取到了最后一行。
代码如下:
cpp
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. 结果
愿你有个喜出望外的一月
。