QT4.6.3文档翻译:QTextStream类参考,QTextStream Class Reference
QTextStream类提供一个便利的用来读取和写入文本的接口。
QTextStream可以在一个 QIODevice ,一个 QByteArray 或者一个 QString 上操作。使用QTextStream的流操作符,你可以方便地读写单词、行和数字。对于生成文本功能 ,QTextStream支持域的填充和对齐,以及数字的格式化等选项。例如:
QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
QTextStream out(&data);
out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
// writes "Result: 3.14 2.7 "
}
使用QTextStream 来读取终端输入和写入终端输出也是常用的用法。QTextStream能识别本地语言,会自动使用正确的解码器来解码标准输入的内容 。例如:
QTextStream stream(stdin);
QString line;
do {
line = stream.readLine();
} while (!line.isNull());
注意你不能对 stdin 使用QTextStream::atEnd(),它在你到达数据流的末尾时返回真 。原因是只要stdin不对QTextStream 提供任何输入, atEnd()就会返回真 ,即使 stdin是打开的并且正在等待更多的字符。
除了使用QTextStream的构造函数,你也可以通过调用 setDevice ()或者 setString ()来设置QTextStream 在其上操作的设备或者字符串 。你可以通过调用 seek ()来找到一个位置 ,而在没有数据可以被读取时 atEnd()会返回真。如果你调用 flush(),QTextStream会清空它的写缓冲区中的所有数据并且写入到设备中,再调用设备上的 flush ()。
在内部,QTextStream使用一个基于Unicode 的缓冲,并且 QTextCodec被用来自动支持不同的字符集。默认地 , QTextCodec::codecForLocale()被用于读写,但是你也可以通过调用 setCodec ()来设置解码器 。自动的Unicode 检测也被支持 。当这个特性被启用 (默认行为)时,QTextStream会检测UTF-16 或者UTF-32 BOM(字节序标记) 并且在读取时切换到合适的UTF 解码器。QTextStream默认情况下不写入BOM,但是你可以通过调用setGenerateByteOrderMark(true)来启用这个 。当QTextStream直接在一个QString上操作时,解码器被禁用。
在读取文本文件时,有3种通常的方式来使用QTextStream:
•.一个单词一个单词地读取。QTextStream支持流化为QString、QByteArray和char*缓冲。单词是使用空格来分隔的 ,而且前面的空格被自动跳过。
•.一个字符一个字符地读取,通过流化为 QChar或者字符类型。这种方法经常被用来在分析文件时进行方便的输入处理 ,不理会字符编码和行尾符号 。要跳过空格 ,调用 skipWhiteSpace()。
由于文本流使用一个缓冲,你不应当使用一个超类的实现来从流中读取数据 。例如 ,如果你有一个 QFile并且使用QFile::readLine()来从中直接读取,而不使用流,那么文本流的内部位置会与文件的位置失去同步 。
默认地,当从一个文本流中读取数字时 ,QTextStream会自动地检测数字的基的表示。例如 ,如果数字以"0x"开始 ,它就被预期为以十六进制格式表示 。如果它以数字1-9 开始 ,它就被预期为以十进制表示 ,等等。你可以通过调用 setIntegerBase ()来设置整数的基 ,由此来禁用自动的检测。例如:
QTextStream in("0x50 0x20");
int firstNumber, secondNumber;
in >> firstNumber; // firstNumber == 80
in >> dec >> secondNumber; // secondNumber == 0
char ch;
in >> ch; // ch == 'x'
QTextStream支持在生成文本时候的很多格式化选项。你可以通过调用 setFieldWidth ()和 setPadChar ()来设置域的宽度和填充字符 。使用 setFieldAlignment()来设置每个域中的对齐。对于实数 ,调用 setRealNumberNotation()和setRealNumberPrecision()来设置表示方式(SmartNotation, ScientificNotation, FixedNotation)和以数位个数表示的产生的数字的精度。某些附加的数字格式化选项也可以通过 setNumberFlags ()使用 。
像标准C++库中的<iostream>一样,QTextStream也定义了多个全局的操作函数:
|
操作 |
描述 |
|
bin |
与setIntegerBase(2)一样。 |
|
oct |
与setIntegerBase(8)一样。 |
|
dec |
与setIntegerBase(10)一样。 |
|
hex |
与setIntegerBase(16)一样。 |
|
showbase |
与setNumberFlags(numberFlags() | ShowBase)一样。 |
|
forcesign |
与setNumberFlags(numberFlags() | ForceSign)一样。 |
|
forcepoint |
与setNumberFlags(numberFlags() | ForcePoint)一样。 |
|
noshowbase |
与setNumberFlags(numberFlags() & ~ShowBase)一样。 |
|
noforcesign |
与setNumberFlags(numberFlags() & ~ForceSign)一样。 |
|
noforcepoint |
与setNumberFlags(numberFlags() & ~ForcePoint)一样。 |
|
uppercasebase |
与setNumberFlags(numberFlags() | UppercaseBase)一样。 |
|
uppercasedigits |
与setNumberFlags(numberFlags() | UppercaseDigits)一样。 |
|
lowercasebase |
与setNumberFlags(numberFlags() & ~UppercaseBase)一样。 |
|
lowercasedigits |
与setNumberFlags(numberFlags() & ~UppercaseDigits)一样。 |
|
fixed |
与setRealNumberNotation(FixedNotation)一样。 |
|
scientific |
与setRealNumberNotation(ScientificNotation)一样。 |
|
left |
与setFieldAlignment(AlignLeft)一样。 |
|
right |
与setFieldAlignment(AlignRight)一样。 |
|
center |
与setFieldAlignment(AlignCenter)一样。 |
|
endl |
相当于operator<<('n')再flush()。 |
|
flush |
相当于flush()。 |
|
reset |
相当于reset()。 |
|
ws |
相当于skipWhiteSpace()。 |
|
bom |
相当于setGenerateByteOrderMark(true)。 |
另外,Qt提供3个全局的使用一个参数的操作符: qSetFieldWidth(), qSetPadChar(),和 qSetRealNumberPrecision()。
参见QDataStream , QIODevice , QFile , QBuffer , QTcpSocket ,和 解码器示例 。
Your opinions
HxLauncher: Launch Android applications by voice commands