Qt扫盲- QTextStream 理论总结

QTextStream 理论总结

  • 一、概述
  • 二、使用
    • 1. 构造函数
    • 2. 立即写入
    • 3. 编码
    • 4. 读取
  • 三、格式化

一、概述

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       "
}

1. 构造函数

使用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()

2. 立即写入

如果调用flush(), QTextStream将清空其写缓冲区中的所有数据,并在设备上调用flush()。相当于就是刷新数据到具体的设备,就像写文件,调用了 flush() 就会立即写入到磁盘中去。

3. 编码

在内部,QTextStream使用基于Unicode的缓冲区,QTextStream使用QTextCodec自动支持不同的字符集。默认情况下,QTextCodec::codecForLocale()用于读写,但也可以通过调用setCodec()来设置编解码器。它还支持自动Unicode检测。当此功能启用时(默认行为),QTextStream将检测UTF-16或UTF-32 BOM(字节顺序标记),并在读取时切换到适当的UTF编解码器。QTextStream默认不会写入BOM,但是我们可以通过调用setGenerateByteOrderMark(true)来启用它。当QTextStream直接操作QString时,将禁用编解码器。

4. 读取

读取文本文件时,有三种使用QTextStream的一般方法:

  • 通过调用 readLine() 或 readAll() 逐读取。
  • 一个word一个word。QTextStream支持流式转换为QStrings、QByteArrays和char*缓冲区。单词由空格分隔,前导空格会自动跳过。
  • 通过流式转换成QChar或char类型逐个字符。在解析文件时,这种方法通常用于方便的输入处理,独立于字符编码和行尾语义。要跳过空格,可以调用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	这里就是读的是 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).

你可能感兴趣的:(#,▶,Qt扫盲,QTextStream,qt文本流,qt5)