QTextStream是与c++的iostream相似的流类,用于更加方便地操作文件文本。
那么,什么是流呢?
流可以理解为数据通过“管道”转移,这是就数据流了。其实将流理解为管道与流体的结合体更好,当我们需要操作某个文件时,将管道的一端接到这个文件上,如这个类的函数:QTextStream(FILE * fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite),传入文件句柄fileHandle(可以是一个QFile对象)。我们也可以指定流的流向,使用第二个参数:QIODevice::OpenMode控制它,如只读QIODevice::Readonly或只写QIODevice::Writeonly等。这样,对文件的读写就抽象为数据流的流动了。
QTextStream公有函数如下:
QTextStream()
QTextStream(QIODevice * device)
QTextStream(FILE * fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(QString * string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(QByteArray * array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(const QByteArray & array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
virtual ~QTextStream()
void setAutoDetectUnicode(bool enabled)//自动查找编码标识:BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。
void setCodec(QTextCodec * codec)//设置编码,默认是QTextCodec::codecForLocale(),即电脑默认的win为gbk,linux为utf-8
void setCodec(const char * codecName)//字符形式编码设置,例:setCodec("UTF-8");
void setGenerateByteOrderMark(bool generate)//当utf编码被使用,BOM信息会被写入到文件中
void setIntegerBase(int base)//设置读取整数时采取的进位制
void setNumberFlags(NumberFlags flags)//影响输出数字的显示格式,有显示基数(QTextStream::ShowBase)如:16 则有("0x"), 8 有("0")等,枚举值1.
void setFieldWidth(int width)//如果设置了域宽FieldWidth,再设置域中字符对齐方式FieldAlignment(下一个函数),并设置填充字符PadChar,则一串字符将占据FieldWidth宽度,不足部分用PadChar填充,并在其中对齐。如"***hi"即FieldWidth为5,FieldAlignment为right,PadChar为*的输出结果。
void setFieldAlignment(FieldAlignment mode)//枚举值2
void setPadChar(QChar ch)
void setRealNumberNotation(RealNumberNotation notation)//实数的记数方式,如显示为科学记数法等。枚举值3
void setRealNumberPrecision(int precision)//设置实数精度,即小数位数
void setStatus(Status status)//返回流的状态,似乎这个设置函数没什么实用性,枚举值4
void setDevice(QIODevice * device)
void setString(QString * string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
void setLocale(const QLocale & locale)
QString read(qint64 maxlen)
QString readAll()
QString readLine(qint64 maxlen = 0)
void reset()
void resetStatus()
bool seek(qint64 pos)
void flush()
void skipWhiteSpace()//跳过空字符,当一个一个字符读取时有用
bool atEnd() const
bool autoDetectUnicode() const
QTextCodec * codec() const
QIODevice * device() const
FieldAlignment fieldAlignment() const
int fieldWidth() const
bool generateByteOrderMark() const
int integerBase() const
QLocale locale() const
NumberFlags numberFlags() const
QChar padChar() const
qint64 pos() const
Status status() const
QString * string() const
RealNumberNotation realNumberNotation() const
int realNumberPrecision() const
QTextStream & operator<<(QString & str)//流的运算符能操纵各种数据类型,这里弄出来两个代表,<<为向流中插入,>>从流中读取。
QTextStream & operator>>(QString & str)//
………………
枚举值:
1,enum QTextStream::NumberFlag
Constant | Value | Description |
---|---|---|
QTextStream::ShowBase | 0x1 | 如果进制是16 ("0x"), 8 ("0"), 或2 ("0b").将进制显示相相应前辍 |
QTextStream::ForcePoint | 0x2 | 在数字中总显示小数点 |
QTextStream::ForceSign | 0x4 | Always put the sign in numbers, even for positive numbers. |
QTextStream::UppercaseBase | 0x8 | Use uppercase versions of base prefixes ("0X", "0B"). |
QTextStream::UppercaseDigits | 0x10 | Use uppercase letters for expressing digits 10 to 35 instead of lowercase. |
Constant | Value | Description |
---|---|---|
QTextStream::AlignLeft | 0 | Pad on the right side of fields. |
QTextStream::AlignRight | 1 | Pad on the left side of fields. |
QTextStream::AlignCenter | 2 | Pad on both sides of field. |
QTextStream::AlignAccountingStyle | 3 | Same as AlignRight, except that the sign of a number is flush left. |
Constant | Value | Description |
---|---|---|
QTextStream::ScientificNotation | 2 | Scientific notation (printf()'s %e flag). |
QTextStream::FixedNotation | 1 | Fixed-point notation (printf()'s %f flag). |
QTextStream::SmartNotation | 0 | Scientific or fixed-point notation, depending on which makes most sense (printf()'s %g flag). |
Constant | Value | Description |
---|---|---|
QTextStream::Ok | 0 | The text stream is operating normally. |
QTextStream::ReadPastEnd | 1 | The text stream has read past the end of the data in the underlying device. |
QTextStream::ReadCorruptData | 2 | The text stream has read corrupt data. |
QTextStream::WriteFailed | 3 | The text stream cannot write to the underlying device. |
与iostream一样,它有很多操纵符,这些操纵符能在输入输出中直接使用,用于格式化输出
Manipulator | Description |
---|---|
bin | Same as setIntegerBase(2).设置进位制为2 |
oct | Same as setIntegerBase(8). |
dec | Same as setIntegerBase(10). |
hex | Same as setIntegerBase(16). |
showbase | Same as setNumberFlags(numberFlags() | ShowBase). |
forcesign | Same as setNumberFlags(numberFlags() | ForceSign). |
forcepoint | Same as setNumberFlags(numberFlags() | ForcePoint). |
noshowbase | Same as setNumberFlags(numberFlags() & ~ShowBase). |
noforcesign | Same as setNumberFlags(numberFlags() & ~ForceSign). |
noforcepoint | Same as setNumberFlags(numberFlags() & ~ForcePoint). |
uppercasebase | Same as setNumberFlags(numberFlags() | UppercaseBase). |
uppercasedigits | Same as setNumberFlags(numberFlags() | UppercaseDigits). |
lowercasebase | Same as setNumberFlags(numberFlags() & ~UppercaseBase). |
lowercasedigits | Same as setNumberFlags(numberFlags() & ~UppercaseDigits). |
fixed | Same as setRealNumberNotation(FixedNotation). |
scientific | Same as setRealNumberNotation(ScientificNotation). |
left | Same as setFieldAlignment(AlignLeft). |
right | Same as setFieldAlignment(AlignRight). |
center | Same as setFieldAlignment(AlignCenter). |
endl | Same as operator<<('\n') and flush(). |
flush | Same as flush(). |
reset | Same as reset(). |
ws | Same as skipWhiteSpace(). |
bom | Same as setGenerateByteOrderMark(true). |
从官网抄来的典型使用方法:
QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
QTextStream out(&data);
out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;//qSetFieldWidth、left 为上述列表中的操纵符
// writes "Result: 3.14 2.7 ",从3.14到2.7的前面正好10个字符,左对齐,默认以空白字符填空
}
也可以改成如下:
QTextStream out(&data);
out.setFieldWidth(10);
out.setFieldAlignment(QTextStream::AlignLeft);
out.setPadChar("*");
out<<3.14<<2.7;
结果将如下:
3.14******2.7*******。