Qt 文件處理詳細講解教程 上篇
本文介紹的是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 文件處理詳細講解教程 下篇。