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是区域设置敏感的,并且会自动使用正确的编解码器解码标准输入。有时候我们需要逐行的去处理数据,我们就可以用下面的代码。可以把 stdin 按照构造函数里面的要求,改成像 QString、或者 QFile 之类的。
例子:
QTextStream stream(stdin);
QString line;
while (stream.readLineInto(&line)) {
...
}
除了使用QTextStream的构造函数,还可以通过调用setDevice()或setString()来设置QTextStream操作的设备或字符串。我们可以通过调用seek()来查找一个位置,当没有数据需要读取时,atEnd()将返回true。
我们可以看到这些构造函数可以 去传递字符串和IO设备的。
QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(QIODevice *device)
QTextStream()
如果调用flush(), QTextStream将清空其写缓冲区中的所有数据,并在设备上调用flush()。相当于就是刷新数据到具体的设备,就像写文件,调用了 flush() 就会立即写入到磁盘中去。
在内部,QTextStream使用基于Unicode的缓冲区,QTextStream使用QTextCodec自动支持不同的字符集。默认情况下,QTextCodec::codecForLocale()用于读写,但也可以通过调用setCodec()来设置编解码器。它还支持自动Unicode检测。当此功能启用时(默认行为),QTextStream将检测UTF-16或UTF-32 BOM(字节顺序标记),并在读取时切换到适当的UTF编解码器。QTextStream默认不会写入BOM,但是我们可以通过调用setGenerateByteOrderMark(true)来启用它。当QTextStream直接操作QString时,将禁用编解码器。
读取文本文件时,有三种使用QTextStream的一般方法:
由于文本流使用了缓冲区,所以不应该使用超类的实现从流中读取数据。例如,如果我们有一个QFile,并直接使用QFile::readLine()而不是使用流读取它,文本流的内部位置将与文件的位置不同步。
默认情况下,当从文本流读取数字时,QTextStream将自动检测数字的基本表示。例如,如果数字以“0x”开头,则认为它是十六进制形式。如果它以数字1 ~ 9开头,则认为它是十进制形式,以此类推。我们可以通过调用setIntegerBase()来设置整数基数,从而禁用自动检测。例子:
QTextStream in("0x50 0x20");
int firstNumber, secondNumber;
in >> firstNumber; // firstNumber == 80
in >> dec >> secondNumber; // secondNumber == 0 这里就是读的是 0x20 的 0 ,这里的得出就是 Qt::dec
char ch;
in >> ch; // ch == 'x' 这里就是读的是 0x20 的 x
QTextStream支持生成文本的许多格式选项。可以调用setFieldWidth()和setPadChar()来设置字段宽度和填充字符。使用setFieldAlignment()设置每个字段的对齐方式。对于实数,调用setRealNumberNotation()和setRealNumberPrecision()来设置生成数字的记数法(SmartNotation、ScientificNotation、FixedNotation)和精度。通过setNumberFlags()还可以获得一些额外的数字格式化选项。
与标准c++库中的一样,QTextStream也定义了几个全局的操作符函数:
Manipulator | Description |
---|---|
Qt::bin | Same as setIntegerBase(2). |
Qt::oct | Same as setIntegerBase(8). |
Qt::dec | Same as setIntegerBase(10). |
Qt::hex | Same as setIntegerBase(16). |
Qt::showbase | Same as setNumberFlags(numberFlags() |
Qt::forcesign | Same as setNumberFlags(numberFlags() |
Qt::forcepoint | Same as setNumberFlags(numberFlags() |
Qt::noshowbase | Same as setNumberFlags(numberFlags() & ~ShowBase). |
Qt::noforcesign | Same as setNumberFlags(numberFlags() & ~ForceSign). |
Qt::noforcepoint | Same as setNumberFlags(numberFlags() & ~ForcePoint). |
Qt::uppercasebase | Same as setNumberFlags(numberFlags() |
Qt::uppercasedigits | Same as setNumberFlags(numberFlags() |
Qt::lowercasebase | Same as setNumberFlags(numberFlags() & ~UppercaseBase). |
Qt::lowercasedigits | Same as setNumberFlags(numberFlags() & ~UppercaseDigits). |
Qt::fixed | Same as setRealNumberNotation(FixedNotation). |
Qt::scientific | Same as setRealNumberNotation(ScientificNotation). |
Qt::left | Same as setFieldAlignment(AlignLeft). |
Qt::right | Same as setFieldAlignment(AlignRight). |
Qt::center | Same as setFieldAlignment(AlignCenter). |
Qt::endl | Same as operator<<(‘\n’) and flush(). |
Qt::flush | Same as flush(). |
Qt::reset | Same as reset(). |
Qt::ws | Same as skipWhiteSpace(). |
Qt::bom | Same as setGenerateByteOrderMark(true). |