QTexstStream用于读写纯文本以及HTML,XML等文本格式的文件,此类考虑了Unicode编码与系统本地编码的或其它任意编码之间的转换问题,别且明确地处理了因使用不同的操作系统而导致的行尾符之间的转换(windows系统的行尾符是“\r\n”,unix和mac os x系统是“\n”)。
QTexstStream的操作对象是QIODevice,可是QFile,QTEmporaryFile,QBuffer,QProcess,QTcpSocket或者QUpdSocket,此外还可以直接在QString上使用,如:
QString str;
QTextStream(&str)<<oct<<31<<" "<<dec<<25<<endl;
qDebug()<<oct<<31<<" "<<dec<<25<<endl;
qDebug输出的结果是“37 25”,这是因为十进制31的八进制值是37,因为QString的编码总是Unicode编码,因此使用QString做QIODevice时如果想要用unicode编码就不用再认为设置了。
QTexstStream还有一些类似<iostream>的选项,比如用showbase设置显示二进制、八进制、十六进制的前缀,使用uppercasedigits和hex输出大写十六进制数:
fileOut<<showbase<<uppercasedigits<<hex<<1234567;
也可以使用成员函数来完成这些设置:
fileOut.setNumberFlags(QTextStream::ShowBase|QTextStream::UppercaseDigits);
fileOut.setIntegerBase(16);
文件包含:
#include <QTextStream>
#include <QMessageBox>
代码:
QFile file("test.txt");
if(!file.open(QIODevice::WriteOnly))
{
QMessageBox::information(this,tr("打开文件失败!"),file.errorString());
}
QTextStream fileOut(&file);
// fileOut.setCodec("UTF-8"); //unicode UTF-8 ANSI
fileOut <<"Helloworld!"<<"\n";
fileOut <<tr("写文件,第").to<<1<<"行."<<endl;
file.flush();
file.close();
输出结果:
Hello world!
D′???t£?μú1DD.
使用上面的方式写文件时,如果文件不存在,会自动创建。写入英文时没有问题,但是如果写入中文,出现的是乱码。
写中文文本文件
文件包含:
#include <QTextStream>
#include <QMessageBox>
#include <QTextCodec>
#include <string>
代码:
QFile file("test.txt");
if(!file.open(QIODevice::WriteOnly | QFile::Text))
{
QMessageBox::information(this,tr("打开文件失败!"),file.errorString());
return;
}
QTextCodec* codec=QTextCodec::codecForName("UTF-8");
std::string strData="abcde写入中文";
char* buf=new char[strData.size()+1];
strcpy(buf,strData.c_str());
QString qStr=qStr.fromLocal8Bit(buf); //fromLocal8Bit是QString的静态成员方法,这里的对象名只起标识类的作用
QTextStream out (&file);
out.setCodec(codec);
out <<qStr<<"\n";
file.flush();
file.close();
输出结果:
abcde写入中文
使用上面的方法可以输出中文,但是过于复杂并且使用不方便。可以使用tr函数来简化问题。