QTextStream
会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。QTextStream
使用 16 位的QChar
作为基础的数据存储单位,同样,它也支持 C++ 标准类型,如 int 等。实际上,这是将这种标准类型与字符串进行了相互转换。
QTextStream
同QDataStream
的使用基本一致,例如下面的代码将把“The answer is 42”写入到 file.txt 文件中:
这里,我们在open()
函数中增加了QIODevice::Truncate
打开方式。我们可以从下表中看到这些打开方式的区别:
我们在这里使用了QFile::WriteOnly | QIODevice::Truncate
,也就是以只写并且覆盖已有内容的形式操作文件。注意,QIODevice::Truncate
会直接将文件内容清空。
- if (data.open(QFile::ReadOnly)) {
- QTextStream in(&data);
- int ans = 0;
- in >> str >> ans;
在使用QDataStream
的时候,这样的代码很方便,但是使用了QTextStream
时却有所不同:读出的时候,str 里面将是 The answer is 42,ans 是 0。这是因为以文本形式写入数据,是没有数据之间的分隔的。还记得我们前面曾经说过,使用QDataStream
写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而文本文件则没有类似的操作。因此,使用文本文件时,很少会将其分割开来读取,而是使用诸如QTextStream::readLine()
读取一行,使用QTextStream::readAll()
读取所有文本这种函数,之后再对获得的对象进行处理。
默认情况下,QTextStream
的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用
这样的函数进行设置。
另外,为方便起见,QTextStream
同std::cout
一样提供了很多描述符,被称为 stream manipulators。因为文本文件是供人去读的,自然需要良好的格式(相比而言,二进制文件就没有这些问题,只要数据准确就可以了)。这些描述符是一些函数的简写,我们可以从文档中找到:
描述符 | 等价于 |
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) |
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) |
- out << bin << 12345678;
就可以了。这等价于
更复杂的,如果我们想要舒服 1234567890 的带有前缀、全部字母大写的十六进制格式(0xBC614E),那么只要使用
- out << showbase << uppercasedigits << hex << 12345678;
即可。
不仅是QIODevice
,QTextStream
也可以直接把内容输出到QString
。例如