Qt 读取文本文件问题

剑神 发布于 2013/05/18 12:55
阅读 2K+
收藏 0

我要说的当然不是Qt怎么读取文本文件的,因为只要知道有QTextStream和QFile,文件读取就很容易了。

这两天在用Qt做文件读取的时候,发现了一个特别蛋疼的问题,就是Qt的QTextStrem用read()函数和seek()函数获取文件特定的某一位置的一段或者某一个字符的时候会出现问题,比如说文本文件的内容总共有10行(这就意味着这个文本有9个回车换行符,也就是九个连着的 '\r'、'\n'),再打开文本时我们能看到每行的数据都是这十个字符:ABCDEFGHIJ,那么当我要读取从第八行的第九个字符开始到第九行的第二个字符,也就是“IJ\r\nAB”。那么假如我是这么读取文件:

QFile tFile("test.txt");
 if(!rLogs.open(QIODevice::ReadOnly | QIODevice::Text))return;
QTextStream read(&tFile);
QString result="";
if(read.seek(12*7+8)){
    result=read.read(6);
}

那么这个时候我就想了办法把result给输出出来了,但是结果却很出人意料,输出的字符串是"IJ\nABC".打断点调试的时候也是这个结果,这就意味着read()函数把'\r'给忽略掉了。于是我在上面的代码下面加了几行:

quint64 fSize=tFile.size();
quint64 rSize=0;
read.seek(0);
while(!read.atEnd()){
    QString tem=read.read(1);
    rSize++;
}
quint64 dis=fSize-rSize;
然后打断点一步步调试,发现fSize的值是118(刚好是 9*12+10),rSize的值为109(刚好是9*11+10),dis的值为9,而tem值也永远不会有'\r'出现.所以这个就是问题了。因此在用Qt的QTextStream进行文件读取的时候就需要小心,如果读取的内容比较特殊,就必须做特殊处理了。



加载中
0
H
Hiitiger

openmode用了QIODevice::Text。

The QIODevice::Text flag passed to open() tells Qt to convert Windows-style line terminators ("\r\n") into C++-style terminators ("\n").

When reading, the end-of-line terminators are translated to '\n'. When writing, the end-of-line terminators are translated to the local encoding, for example '\r\n' for Win32.

返回顶部
顶部