QTextStream是一个非常强大的类,它可以对IO设备、QString、QByteArray等类进行方便的读写操作。
在文本流中,QTextStream重载了两种运算符以简化输入输出流的用法
- 运算符<<被称为插入符 往该流对象中插入数据
- 运算符>>被称为提取符 从流对象中提取出数据
例一:
#include <QTextStream>
int main() {
// 使用提取符从标准输入中提取输入数据
QTextStream in(stdin);
int i;
in >> i;
float f;
in >> f;
char buf[50];
in >> buf;
// 使用插入符向标准输出中写数据
QTextStream out(stdout);
out << "i=" << i;
out << " j=" << f;
out << " buf=" << buf;
/*
输入:
10
20.20
buffer
输出:
i=10 j=20.2 buf=buffer
*/
}
例二:(将提取符和插入符连续使用)
#include <QTextStream>
int main() {
// 连续使用提取符从标准输入中提取输入数据
QTextStream in(stdin);
int i;
float f;
char buf[50];
in >> i >> f >> buf;
// 连续使用插入符向标准输出中写数据
QTextStream out(stdout);
out << "i = " << i
<< " f = " << f
<< " buf = " << buf;
/*
输入:
10
20.20
buffer
输出:
i=10 j=20.2 buf=buffer
*/
}
例三:(输入的数据错误)
#include <QTextStream>
int main() {
// 连续使用提取符从标准输入中提取数据
QTextStream in(stdin);
int i = 10;
float f = 20.20;
char buf[50] = "meno";
in >> i >> f >> buf;
// 连续使用插入符向标准输出中写数据
QTextStream out(stdout);
out << "i=" << i << " status:" << out.status() << "\n";
out << "f=" << f << " status:" << out.status() << "\n";
out << "buf=" << buf << " status:" << out.status() << endl;
/*
输入
hello my world
输出
i=0 status:0
f=0 status:0
buf=hello status:0
*/
}
以上结果表明,输入流会跳过那些输入错误的数据,而其对应的数据类型变量会被赋值为默认值。而流的状态值也不会被修改,但是在C++标准库中,流状态会被修改。 后面的endl,其实endl的作用是刷新流,并且换行,这和标准库中的endl差不多,而且endl是属于操纵算子中的一类。刷新流的真正作用就是将那些存储在流内部缓冲区中的数据真正输出。
endl的例子:
#include <QTextStream>
int main() {
QTextStream in(stdin);
int i;
float f;
char buf[50];
in >> i >> f >> buf;
QTextStream out(stdout);
out << "i=" << i
<< " f=" << f
<< " buf=" << buf; // 去掉了endl
while (true) {}
}
当我们再次运行程序,输入数据后,程序进行了真正的输出,这是因为,在out超出作用域后,调用QTextStream析构函数,刷新缓冲区,控制台就有打印信息了。
以上代码,都使用的是标准输入输出,如果想要从文件中读取和写入,只需要向QTextStream的构造函数中传入QFile对象即可。
例四:
#include <QTextStream>
#include <QFile>
void testTextStream5() {
QFile fileIn("main.cpp"); // 请确保exe所在目录存在main.cpp
Q_ASSERT(fileIn.open(QIODevice::ReadOnly));
QTextStream in(&fileIn);
QFile fileOut("main.out");
Q_ASSERT(fileOut.open(QIODevice::WriteOnly));
QTextStream out(&fileOut);
QString line;
int cnt = 0;
while (in.readLineInto(&line)) {
out << QStringLiteral("%1: %2\n").arg(++cnt).arg(line);
}
}
上面的程序是将main.cpp中的文本读取出来加上行号,再写入main.out中,你是否感觉到输入输出流的强大呢,只用少许的代码,就可以将一个文件的内容复制到另一个文件,并且还可以针对文件中的内容加以修改。