Qt:QTextStream
阅读原文时间:2023年07月10日阅读:2

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++库,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() | ShowBase).

Qt::forcesign

Same as setNumberFlags(numberFlags() | ForceSign).

Qt::forcepoint

Same as setNumberFlags(numberFlags() | ForcePoint).

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() | UppercaseBase).

Qt::uppercasedigits

Same as setNumberFlags(numberFlags() | UppercaseDigits).

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).

比如,我们要用十进制和十六进制输出两个值:

QTextStream in("0x50 20");
int firstNumber, secondNumber;

in >> hex >> firstNumber; // firstNumber == 80
in >> dec >> secondNumber; // secondNumber == 20

Header:

#include

qmake:

QT += core

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

 

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 }

当前文本流的状态

返回值类型

方法

说明

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中

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章