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 opinionsHxLauncher: Launch Android applications by voice commands