Qt模块化笔记之core——Input/Output文件操作-流QTextStream使用

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.
2,enum QTextStream::FieldAlignment

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.
3,enum QTextStream::RealNumberNotation

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).
4,enum QTextStream::Status

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*******。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值