StupidBeauty
Read times:1127Posted at:Tue Oct 5 18:38:33 2010 - no title specified

Q T extStream实现的一个细节:对空白字符的跳过

这篇文章里面研究的是关于 QT4的东西。

QtextStream在使用 >> 读取文件里的字段时,会自动跳过文件中的空白字符 。这是本座早就知道的 ,只是本座没注意过 ,这个跳过空白字符的动作是在什么时机完成的 。今天在调试程序的时候 ,碰到个问题了,引起了本座对这个问题的研究 ,研究的结果呢,本座认为,QTextStream是在读取字段之前将前面的空白字符跳过的 ,读取完了字段之后 ,QTextStream不多读取字符。

情况是这样的 ,本座在程序中需要读取一个文本文件 ,并且进行解释,文本文件里面有这样一段:

128.2 6

1 GT---C ---C-AC --GCAGC ---CGC -T--GAC --AGAC-AC ---AC-C

在这里 ,首先要将128.2、6这两上字段分别以浮点数 、整数读取,再将下面的一行作为整行读取。本座写的代码是这样的

TrfFilterOutputRdStrm >> CopyNum >> ConsesSize ; //读取重复个数、重复长度。分别是浮点数 、整数。

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

读取之后的结果呢 CopyNum ConsesSize 都正常读取了,而 CrntLine 是空的。于是本座就思考了

本座猜测的原因是读取了 ConsesSize 这个整数之后,这一行后面的换行符没有被跳过 ,而接下来的 readLine() 函数读取字符直到换行符为止 ,于是读取到了一个空的字符串。

为了验证这个猜测 ,做了一个实验,就是在下面再加一句 readLine() ,结果发现第二个 readLine() 执行之后, CrntLine 的结果就是 1 GT---C ---C-AC --GCAGC ---CGC -T--GAC --AGAC-AC ---AC-C

为了继续验证这个猜测 ,本座还去看了一下 QTextStream的源代码,经过一堆跟踪 ,最后具体执行读取整数的操作的函数是QTextStreamPrivate::getNumber(), 并且里面具体与本篇文章相关的代码是:

if ( sign != locale . negativeSign () && sign != locale . positiveSign ()) {

if (!sign.isDigit()) {

ungetChar(sign);

return npsMissingDigit;

}

val += sign.digitValue();

ndigits++;

}

本座理解的大意是 ,一个个字符地读取 如果读取到的字符是数字 ,就放入到读取的结果中 。如果读取 到的字符不是数字 ,就将它退货到缓冲区中 。上面这段代码就是在读取到的字符不是数字的情况下退货的情况

所以总结呢 QTextStream是在具体读取时跳过空白字符再读取字段的 ,读取完了字段之后,不再多读一个字符,它是一个不贪心的东西。

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

HxLauncher: Launch Android applications by voice commands