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 "
}
QTextStream也常用于控制台输入输出,它可以自动将标准输入解码为正确的格式,例如:
QTextStream stream(stdin);
QString line;
while(stream.readLineInto(&line)){
…
}
除了用QTextStream构造器外,也可以通过setDevice() 和 setString()设置QTextStream的Device和String。可以用seek()跳转到指定位置,如果没有数据可读,那么atEnd()会返回true。调用flush()后,QTextStream就会把所有数据从转移到device中,并且调用device的flush()。
QTextStream在内部使用Unicode编码,并且使用QTextCodec来支持不同的字符编码。默认情况下,QTextCodec::codecForLocale()是读写时所用的编码,调用setCodec()设置编码。
QTextStream使用三种方式读取文本文件:
由于QTextStream使用了buffer,所以我们不能用超类对象从流中读取。例如,如果我们有一个QFile对象并直接用QFile::readLine()来读取,而不是通过流,那么TextStream的在文件中位置将会失去同步。
默认情况下,当从文本流中读取数字时,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++库
Manipulator
Description
Same as setIntegerBase(2).
Same as setIntegerBase(8).
Same as setIntegerBase(10).
Same as setIntegerBase(16).
Same as setNumberFlags(numberFlags() | ShowBase).
Same as setNumberFlags(numberFlags() | ForceSign).
Same as setNumberFlags(numberFlags() | ForcePoint).
Same as setNumberFlags(numberFlags() & ~ShowBase).
Same as setNumberFlags(numberFlags() & ~ForceSign).
Same as setNumberFlags(numberFlags() & ~ForcePoint).
Same as setNumberFlags(numberFlags() | UppercaseBase).
Same as setNumberFlags(numberFlags() | UppercaseDigits).
Same as setNumberFlags(numberFlags() & ~UppercaseBase).
Same as setNumberFlags(numberFlags() & ~UppercaseDigits).
Same as setRealNumberNotation(FixedNotation).
Same as setRealNumberNotation(ScientificNotation).
Same as setFieldAlignment(AlignLeft).
Same as setFieldAlignment(AlignRight).
Same as setFieldAlignment(AlignCenter).
Same as operator<<('\n') and flush().
Same as flush().
Same as reset().
Same as skipWhiteSpace().
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_)
enum
FieldAlignment { AlignLeft, AlignRight, AlignCenter, AlignAccountingStyle }
对齐方式
enum
NumberFlag { ShowBase, ForcePoint, ForceSign, UppercaseBase, UppercaseDigits }
整数、float、double数字输出时的显示格式
flags
enum
RealNumberNotation { ScientificNotation, FixedNotation, SmartNotation }
float、double表示方法
enum
Status { Ok, ReadPastEnd, ReadCorruptData, WriteFailed }
当前文本流的状态
bool
atEnd()
如果QTextStream中没有更多数据可读,返回true
bool
如果允许自动监测Unicode则返回true
QTextCodec *
codec()
编解码器
QIODevice *
device()
Device
QTextStream::FieldAlignment
对齐方式
int
文本宽度
void
flush()
刷新所有等待写入Device的buffer中的数据
bool
当采用UTF编码器时,如果QTextStream被设置为生成UTC BOM时返回true
int
当前进制
QLocale
locale()
QTextStream::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
数字标识
int
数字精度
void
reset()
重置格式选项
void
重置状态
bool
seek(qint64 pos)
跳转到Pos处
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
跳过开头的空格字符,之后读取全部
QTextStream::Status
status()
状态
QString *
string()
QTextStream的string
QTextStream &
operator<<(T t)
写入t到stream中,T可以是任何常见Qt、C格式
QTextStream &
operator>>(T &t)
从stream中读取一个T存入t中
手机扫一扫
移动阅读更方便
你可能感兴趣的文章