本文介绍的是Qt 文件处理的内容。Qt提供了QFile类来进行文件处理,为了更方便地处理文本文件或二进制文件,Qt还提了QTextStream类和QDataStream类,处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo,处理目录可以使用QDir.监视文件和目录变化可以使用QFileSystemWatcher. 。
读写文本文件
QFile类提供了读写文件的接口,QFile类可以读写文本文件,二进制文件和Qt资源文件,也可以使用更方便的QTextStream,QDataStream类读取文本文件和二进制文件,要打开一个文件,可以在构造函数中指定文件名,也可以在任何时候使用setFileName()函数设置文件名,打开文件使用open函数,关闭文件使用close函数。QFile中可以使用QIODevice中继承的readLine()函数读写文本文件的一行。如:
- QFile file("zeki.txt");
- if(file.open(QIODevice::ReadOnly))
- {
- char buffer[2048];
- qint 64 lineLen=file.readLine(buffer,sizeof(buffer));
- if(lineLen!=-1)
- {
- qDebug< }
- }
如果读取成功,readLine返回实际读取的字节数,如果读取失败则返回-1
QTextStream提供了更为方便的接口来读写文本,QTextStream可以操作QIODevice,QByteArray,QString.QTextStream使用流操作符,可以方便地读写单词,行和数字。为了产生文本,QTextStream提供了填充,对齐和数字格式化的格式选项。如
- QFile data("test.txt");
- if(data.open(QFile::WriteOnly|QFile::Truncate))
- {
- QTextStream out(&data);
- out< }
QTextStream的格式化函数
qSetFieldWidth(int width) 设置字段宽度
qSetPadChar(QChar ch) 设置填充字符
qSetRealNumberPrecision(int precision) 设置实数精度
在QTextStream中使用的默认编码是QTextCodec::codecForLocal()函数返回的编码,同时能够自动检测Unicode。也可以使用QTextStream::setCodec(QTextCodec *codec)函数设置的流编码。
操作二进制文件
QDataStream类提供了将二进制文件串行化的功能,QDataStream实现了c++基本数据类型的串行化,如char,short,int char* 更复杂的数据类型串行化通过将数据类型分解为基本的数据类型来完成。下面用来写二进制数据到数据流。
- QFile file("binary.dat");
- file.open(QIODevice::WriteOnly);
- QDataStream out(&file);
- out< out<<(qint32)42<<(qint32)96;
将上面写入的文件读入的过程为:
- QFile file("binary.dat");
- file.open(QIODevice::ReadOnly);
- QDataStream in(&file);
- QString str;
- qint32 x,y;
- in>>str>>x>>y;
每一个条目都可以定义的二进制格式写入文件,Qt中的很多类型,包括QBrush,QColor,QDateTime,QFont,QPixmap,QString,QVariant等都可以写入数据流。
如果需要读取原始数据,可以使用readRawData()读取数据到预先定义好的char *缓冲区,写原始数据使用writeData(),读写原始数据需要对数据进行编码和解码。
下面例子演示了使用QDataStream进行读写文件的过程。
- #include
- #include
- using namespace std;
- int main(int argc,char **argv)
- {
- QCoreApplication app(argc,argv);
- QFile file("binary.file");
- file.open(QIODevice::WriteOnly|QIODevice::Truncate);
- QDataStream out(&file);
- out< out< out<<(qint32)21;
- file.close();
- file.setFileName("binary.file");
- if(!ifle.open(QIODevice::ReadOnly))
- {
- cout<<"打开文件错误!";
- return 1;
- }
- QDataStream in(&file);
- QString name;
- QDate birthday;
- qint32 age;
- in>>name>>birthday>>age;
- qDebug()< cout< qPrintable(birthday.toString("yyyy MMMM dd dddd"));
- file.close();
- return 0;
- }
在例子中,QDataStream类写入了姓名(QString),生日(QDate),和年龄(qint32)三个数据,读取时使用相同的类型读出。QDataStream可以读取任意以QIODevice为基类生成的对象产生的数据。如QTcpSocket,QUdpSocket,QBuffer,QFile,QProcess等类的数据。可以使用QDataStream在QAbstractSocket一端写入数据,另一端使用QDataStream读取数据,这样就免去了繁琐的高低端字节转换过程。
临时文件
实际应用中有时可能需要使用临时文件,Qt中提供QTemporaryFile类来提供临时文件。QTemporayFile可以安全地创建一个***无二的临时文件。临时文件通过open()来创建。Qt可以保证临时文件不会重复。在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close()关闭后还可以打开,只要临时文件对象还没有销毁,临时文件就一直存在并由QTemporaryFile内部保持打开。系统的临时目录可以通过QDir::tempPath()来获取,unix/linux系统上的临时目录通常时/temp在windows上通常是TEM/TMP指定
小结:有关Qt文件处理先到这,想要对关Qt文件处理,了解更多的话,请关注 Qt 文件处理详细讲解教程 下篇。