StupidBeauty
Read times:1211Posted at:Fri Oct 1 12:42:41 2010 - no title specified

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

  • •.一块一块地读取,通过调用 readLine()或者readAll()

  • •.一个单词一个单词地读取QTextStream支持流化为QStringQByteArray和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
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands