StupidBeauty
Read times:1076Posted at:Mon Oct 4 15:54:52 2010 - no title specified

Q F ile::atEnd()

QT4中,读取文本文件时 ,一般是使用QFile来打开文件,再将QTextStream绑定到打开了文件的QFile上。再使用 QTextStream来进行文件的读取工作 。在读取过程中 ,使用 atEnd()来检查是否已经读完了文件 。问题就是 QFile与QTextStream都有atEnd()函数。用哪个好呢

今天本座写代码时 ,用的是 QFile的atEnd()函数,结果代码运行过程与预期的不一样 ,调试了一番之后 ,认为事情是这样的 :由于 QTextStream使用自己的缓冲,所以当你开始使用QTextStream做出读取数据的动作时, 它就会从 QFile里面读取一定的数据来填充自己的缓冲区,而它读取的数据量不一定与你想要读取的数据量相同,可能会比你读取的数据量大,这样就有可能导致 ,你只读取了一个整数,而文件里面明明还有更多其它的数据,但是你使用QFile::atEnd()却发现文件读到头了。因为 ,QFile里面的文件指针确实到末尾了,这个时候,应当要使用QTextStream::atEnd()来判断文本文件是否到头

例如 ,下面这个代码片段展示了 QFile::atEnd()在上面所说的情况下的表现:

OpenResult=TrfFilterOutputFile.open( QIODevice ::ReadOnly); //以只读方式打开。

ui->LogPlainTextEdit->appendPlainText(tr( "After Open.TrfFilterOutputFile.atEnd():%1" ).arg(TrfFilterOutputFile.atEnd())); //Debug.

TrfFilterOutputRdStrm.setDevice(&TrfFilterOutputFile); //绑定输入流。

ui->LogPlainTextEdit->appendPlainText(tr( "After SetDevice.TrfFilterOutputFile.atEnd():%1" ).arg(TrfFilterOutputFile.atEnd())); //Debug.

QString CrntLine= "" ; //当前读取的行。

//先跳过一段注释:

while (!TrfFilterOutputFile.atEnd()) //文件还耄读完。

{

CrntLine=TrfFilterOutputRdStrm.readLine(); //读取一行。

        ui -> LogPlainTextEdit -> appendPlainText ( tr ( "After ReadLine.TrfFilterOutputFile.atEnd():%1" ). arg ( TrfFilterOutputFile . atEnd ())); //Debug.

上面代码里面有三次输出了 QFile::atEnd()的结果,第一次是在刚打开文件时 ,第二次是在刚绑定文本流的时候 ,第三次是使用QTextStream读取了一个字符串时,在本座的这个例子中 ,测试的结果是:假,假,真。也就是 ,在这个例子中 进行了读取操作之后, QTextStream已经将文本的内容全部读到缓冲区中了

所以读取文本文件时 ,还是要使用QTextStream::atEnd()来判断 是否已经读末尾了

另外 QTextStream的文档里面说了 ,对于stdin进行读取时,不要使用QTextStream::atEnd()来判断文件是否已经结束。

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands