Qt:QTextStream
0、说明
QTextStream提供了读写文本文件的接口。
QTextStream可以操作QIODevice, QByteArray 和 QString,调用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 stream(stdin); QString line; while(stream.readLineInto(&line)){ ... }
2)Device、flush与编码
除了用QTextStream构造器外,也可以通过setDevice() 和 setString()设置QTextStream的Device和String。可以用seek()跳转到指定位置,如果没有数据可读,那么atEnd()会返回true。调用flush()后,QTextStream就会把所有数据从转移到device中,并且调用device的flush()。
QTextStream在内部使用Unicode编码,并且使用QTextCodec来支持不同的字符编码。默认情况下,QTextCodec::codecForLocale()是读写时所用的编码,调用setCodec()设置编码。
3)读取文本文件
QTextStream使用三种方式读取文本文件:
- 一块一块读,readLine() or readAll();
- 一个字一个字读(即一次读一个字符串):QTextStream支持流入QStrings, QByteArrays 和char *的buffer。字间通过空格分隔。
- 一个字符一个字符读:流入QChar或char,通常用于文件解析时。
由于QTextStream使用了buffer,所以我们不能用超类对象从流中读取。例如,如果我们有一个QFile对象并直接用QFile::readLine()来读取,而不是通过流,那么TextStream的在文件中位置将会失去同步。
4)格式与数字
默认情况下,当从文本流中读取数字时,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()设置符号和精度,一些额外的数字格式项通过setNumberFlags()设置。
类似标准C++库<iostream>,QTextStream也定义了一些全局操作符,这使得我们在使用<<与>>时,可以通过这些全局操作符及相关函数进行输出格式上的一些设置:
比如,我们要用十进制和十六进制输出两个值:
QTextStream in("0x50 20"); int firstNumber, secondNumber; in >> hex >> firstNumber; // firstNumber == 80 in >> dec >> secondNumber; // secondNumber == 20
1、模块和加载项
Header: | #include <QTextStream> |
qmake: | QT += core |
2、构造
QTextStream(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() |
3、静态字段
enum | FieldAlignment { AlignLeft, AlignRight, AlignCenter, AlignAccountingStyle } | 对齐方式 |
enum | NumberFlag { ShowBase, ForcePoint, ForceSign, UppercaseBase, UppercaseDigits } | 整数、float、double数字输出时的显示格式 |
flags | NumberFlags | |
enum | RealNumberNotation { ScientificNotation, FixedNotation, SmartNotation } | float、double表示方法 |
enum | Status { Ok, ReadPastEnd, ReadCorruptData, WriteFailed } | 当前文本流的状态 |
6、实例方法
返回值类型 |
方法 |
说明 |
bool | atEnd() | 如果QTextStream中没有更多数据可读,返回true |
bool | autoDetectUnicode() | 如果允许自动监测Unicode则返回true |
QTextCodec * | codec() | 编解码器 |
QIODevice * | device() | Device |
QTextStream::FieldAlignment | fieldAlignment() | 对齐方式 |
int | fieldWidth() | 文本宽度 |
void | flush() | 刷新所有等待写入Device的buffer中的数据 |
bool | generateByteOrderMark() | 当采用UTF编码器时,如果QTextStream被设置为生成UTC BOM时返回true |
int | integerBase() | 当前进制 |
QLocale | locale() | |
QTextStream::NumberFlags | numberFlags() | number flags |
QChar | padChar() | 填充字符 |
qint64 | pos() | 当前位置 |
QString | read(qint64 maxlen) | 读取至多maxlen个字符 |
QString | readAll() | 读取全部 |
QString | readLine(qint64 maxlen = 0) | 读一行,至多maxlen |
bool | readLineInto(QString *line, qint64 maxlen = 0) | 读一行到line中,至多maxlen |
QTextStream::RealNumberNotation | realNumberNotation() | 数字标识 |
int | realNumberPrecision() | 数字精度 |
void | reset() | 重置格式选项 |
void | resetStatus() | 重置状态 |
bool | seek(qint64 pos) | 跳转到Pos处 |
void |
setAutoDetectUnicode(bool enabled) |
设置是否自动检测编码 |
setCodec(QTextCodec *codec) setCodec(const char *codecName) |
设置编解码器 | |
setDevice(QIODevice *device) | 设置Device | |
setFieldAlignment(QTextStream::FieldAlignment mode) | 对齐方式 | |
setFieldWidth(int width) | 文本宽度 | |
setGenerateByteOrderMark(bool generate) | ||
setIntegerBase(int base) | 进制 | |
setLocale(QLocale locale) | ||
setNumberFlags(QTextStream::NumberFlags flags) | number flag | |
setPadChar(QChar ch) | 填充字段 | |
setRealNumberNotation(QTextStream::RealNumberNotation notation) | 数字标识 | |
setRealNumberPrecision(int precision) | 数字精度 | |
setStatus(QTextStream::Status status) | 状态 | |
setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite) | 为string设置当前字符串 | |
void | skipWhiteSpace() | 跳过开头的空格字符,之后读取全部 |
QTextStream::Status | status() | 状态 |
QString * | string() | QTextStream的string |
QTextStream & | operator<<(T t) | 写入t到stream中,T可以是任何常见Qt、C格式 |
QTextStream & | operator>>(T &t) | 从stream中读取一个T存入t中 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性