当前位置:首页 > 编程笔记 > 正文
已解决

Qt扫盲- QTextStream 理论总结

来自网友在路上 180880提问 提问时间:2023-10-20 19:38:50阅读次数: 80

最佳答案 问答题库808位专家为你答疑解惑

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 == 80in >> dec >> secondNumber;     // secondNumber == 0	这里就是读的是 0x20 的 0 ,这里的得出就是 Qt::decchar ch;in >> ch;                      // ch == 'x' 这里就是读的是 0x20 的 x 

三、格式化

QTextStream支持生成文本的许多格式选项。可以调用setFieldWidth()和setPadChar()来设置字段宽度和填充字符。使用setFieldAlignment()设置每个字段的对齐方式。对于实数,调用setRealNumberNotation()和setRealNumberPrecision()来设置生成数字的记数法(SmartNotation、ScientificNotation、FixedNotation)和精度。通过setNumberFlags()还可以获得一些额外的数字格式化选项。

与标准c++库中的一样,QTextStream也定义了几个全局的操作符函数:

ManipulatorDescriptionQt::binSame as setIntegerBase(2).Qt::octSame as setIntegerBase(8).Qt::decSame as setIntegerBase(10).Qt::hexSame as setIntegerBase(16).Qt::showbaseSame as setNumberFlags(numberFlags()Qt::forcesignSame as setNumberFlags(numberFlags()Qt::forcepointSame as setNumberFlags(numberFlags()Qt::noshowbaseSame as setNumberFlags(numberFlags() & ~ShowBase).Qt::noforcesignSame as setNumberFlags(numberFlags() & ~ForceSign).Qt::noforcepointSame as setNumberFlags(numberFlags() & ~ForcePoint).Qt::uppercasebaseSame as setNumberFlags(numberFlags()Qt::uppercasedigitsSame as setNumberFlags(numberFlags()Qt::lowercasebaseSame as setNumberFlags(numberFlags() & ~UppercaseBase).Qt::lowercasedigitsSame as setNumberFlags(numberFlags() & ~UppercaseDigits).Qt::fixedSame as setRealNumberNotation(FixedNotation).Qt::scientificSame as setRealNumberNotation(ScientificNotation).Qt::leftSame as setFieldAlignment(AlignLeft).Qt::rightSame as setFieldAlignment(AlignRight).Qt::centerSame as setFieldAlignment(AlignCenter).Qt::endlSame as operator<<(‘\n’) and flush().Qt::flushSame as flush().Qt::resetSame as reset().Qt::wsSame as skipWhiteSpace().Qt::bomSame as setGenerateByteOrderMark(true).
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"Qt扫盲- QTextStream 理论总结":http://eshow365.cn/6-20364-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!