• 7788阅读
  • 6回复

[提问]有没有什么方法可以逆向读取文件? [复制链接]

上一主题 下一主题
离线wjz2047
 

只看楼主 倒序阅读 楼主  发表于: 2014-03-09
       我要读取某文件的倒数10行数据,请问应该怎么操作?
我想把文件中的数据全部读入栈中,然后pop出最后几行数据。但我又觉得如果文件过大,是不是有点浪费资源,大家怎么看?
离线realfan

只看该作者 1楼 发表于: 2014-03-09
一次全读进来放到一个QString中,用lastIndexOf从后向前搜换行符,找到你要的那行,或正则表达式,应该可以一次定位。没必要用栈。
离线dbzhang800

只看该作者 2楼 发表于: 2014-03-09
可以QFile::seek(), 从某个位置开始读取文件,可以QFile::map(), 将从某个位置开始的内容直接映射到内存。
离线realfan

只看该作者 3楼 发表于: 2014-03-10
QString str = ....readAll();
int idx1 = str.lastIndexOf( QRegExp( "(.*\n){10}") );  //找到倒数第10个换行符
int idx2 = str.lastIndexOf("\n", idx1 - 1);  //找到倒数第11个换行符
QString strL10 = str.mid(idx2 + 1, idx1 - idx2);
具体边界及未找到的异常你自己再处理下
或者
int idx1 = str.lastIndexOf(QRegExp("\n.*(.*\n){10}")) + 1; //找到倒数第10行的开始位置
int idx2 = str.indexOf("\n", idx1); //找到第10行结束位置
QString strL10 = str.mid(idx1, idx2 - idx1); //到第10行内容,不含换行符
离线wjz2047

只看该作者 4楼 发表于: 2014-03-10
回 realfan 的帖子
realfan:QString str = ....readAll();
int idx1 = str.lastIndexOf( QRegExp( "(.*\n){10}") );  //找到倒数第10个换行符
int idx2 = str.lastIndexOf("\n", idx1 - 1);  //找到倒数第11个换行符
QString strL10 = str.mid(idx2 + 1, idx1 - idx .. (2014-03-10 09:41) 

谢谢版主的回答
离线realfan

只看该作者 5楼 发表于: 2014-03-10
回 wjz2047 的帖子
wjz2047:谢谢版主的回答 (2014-03-10 10:02) 

int idx1 = str.lastIndexOf(QRegExp("\n.*(.*\n){10}")) + 1; //找到倒数第10行的开始位置
int idx2 = str.indexOf("\n", idx1); //找到第10行结束位置
QString strL10 = str.mid(idx1, idx2 - idx1); //到第10行内容,不含换行符
这个可能更直观些。


如果文件每行长度是固定的,按张老师所说的用seek更方便
离线realfan

只看该作者 6楼 发表于: 2014-03-10
回 wjz2047 的帖子
wjz2047:谢谢版主的回答 (2014-03-10 10:02) 

纠正一下,因为点.在Qt的正则中,表示任何字符,包括换行符,所以要修改一下
int idx1 = str.lastIndexOf(QRegExp("\n.*(.*\n){11}")) + 1; //找到倒数第10行的开始位置(假设最后一行以\n结束
int idx2 = str.indexOf("\n", idx1); //找到第10行结束位置
QString strL10 = str.mid(idx1, idx2 - idx1); //倒数第10行内容,不含换行符
快速回复
限100 字节
 
上一个 下一个