1.引言
很多應用程序都具備操作文件的能力,包括對文件進行寫入和讀取,創建和刪除文件等等,甚至某些應用程序的就是為了操作文件,像WPS Office。基于此Qt框架中專門提供了對文件操作的類:QFile。
2.QFile文件操作
QFile類支持對文件進行讀取和寫入,刪除,重命名,拷貝等常見的文件操作,它既可以操作文本文件,也可以用來操作二進制文件。
在Qt代碼中我們使用QFIle類,需要先引入QFile的頭文件:#include <QFile>
。常見QFile類對象時,常見的構造函數有:
QFile()
QFile(QObject *parent)
參數parent
用來指定要操作的目標文件,包含文件的存儲目錄和文件名,存儲路徑可以使用絕對地址(比如"D:/Demo/text.txt")或者相對路徑(比如"./Demo/text.txt")。路徑中的分隔符要用"/"表示。
通常情況下,我們一般調用第二個構造函數來直接指明要操作的文件,對于第一個構造函數而言,我們還需要調用 setFileName()
函數來指明要操作的文件。
與C++的讀寫規則一樣,在對文件進行相關操作之前,我們需要先打開文件,打開文件我們使用 open函數
。常用的語法格式為:
bool QFile::open(OpenMode Mode);
Mode參數表示不同的打開方式,下列羅列了參數的可選值和及其不同的含義:
打開模式 | 含義 |
---|---|
QIODevice::ReadOnly | 以只讀模式打開文件。 |
QIODevice::WriteOnly | 以只寫模式打開文件。如果文件不存在,將創建新文件;如果文件已存在,其內容將被清空。 |
QIODevice::ReadWrite | 以讀寫模式打開文件。 |
QIODevice::Append | 以追加模式打開文件,寫入的數據將追加到文件末尾,原有內容保留。 |
QIODevice::Truncate | 打開文件時清空其內容。通常與 WriteOnly 或 ReadWrite 一起使用。 |
QIODevice::Text | 在文本模式下打開文件,處理不同平臺的行結束符(如將 Windows 的 \r\n 轉換為 \n )。 |
QIODevice::Unbuffered | 以非緩沖模式打開文件,數據將直接寫入磁盤而不經過緩沖區。 |
根據需要我們可以一次性選擇多個值,值和值之前使用 |
來進行分割,比如:
QIODevice::ReadOnly
|QIODevice::Text
表示只允許對文件進行讀操作,讀取文件時,會將行尾結束符轉換為 ‘\n’;
QIODevice::WriteOnly
|QIODevice::Text
表示只允許對文件進行寫操作,將數據寫入文件時,會將行尾結束符轉換為本地格式;
QIODevice::ReadWrite
|QIODevice::Text
|QIODevice::Append
但選擇的多個值之前不能相互沖突,比如比如 Append 和 Truncate 不能同時使用。
如果文件成功打開,open() 函數返回 true,否則返回 false。
QFile 類提供了很多功能實用的方法,可以快速完成對文件的操作,下表列舉了常用的一些:
qint64 QFile::size() const | 獲取當前文件的大小。對于打開的文件,該方法返回文件中可以讀取的字節數。 |
---|---|
bool QIODevice::getChar(char *c) | 從文件中讀取一個字符,并存儲到 c 中。讀取成功時,方法返回 true,否則返回 false。 |
bool QIODevice::putChar(char c) | 向文件中寫入字符 c,成功時返回 true,否則返回 false。 |
QByteArray QIODevice::read(qint64 maxSize) | 從文件中一次性最多讀取 maxSize 個字節,然后返回讀取到的字節。 |
qint64 QIODevice::read(char *data, qint64 maxSize) | 從文件中一次性對多讀取 maxSize 個字節,讀取到的字節存儲到 data 指針指定的內存控件中。該方法返回成功讀取到的字節數。 |
QByteArray QIODevice::readAll() | 讀取文件中所有的數據。 |
qint64 QIODevice::readLine(char *data, qint64 maxSize) | 每次從文件中讀取一行數據或者讀取最多 maxSize-1 個字節,存儲到 data 中。該方法返回實際讀取到的字節數。 |
qint64 QIODevice::write(const char *data, qint64 maxSize) | 向 data 數據一次性最多寫入 maxSize 個字節,該方法返回實際寫入的字節數。 |
qint64 QIODevice::write(const char *data) | 將 data 數據寫入文件,該方法返回實際寫入的字節數。 |
qint64 QIODevice::write(const QByteArray &byteArray) | 將 byteArray 數組中存儲的字節寫入文件,返回實際寫入的字節數。 |
bool QFile::copy(const QString &newName) | 將當前文件的內容拷貝到名為 newName 的文件中,如果成功,方法返回 true,否則返回 false。 copy 方法在執行復制操作之前,會關閉源文件。 |
bool QFile::rename(const QString &newName) | 對當前文件進行重命名,新名稱為 newName,成功返回 true,失敗返回 false。 |
bool QFile::remove() | 刪除當前文件,成功返回 true,失敗返回 false。 |
3.演示示例
3.1實驗一
演示了 QFile
類讀寫文本文件的過程
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{//創建 QFile 對象,同時指定要操作的文件QFile file("D:/demo.txt");//對文件進行寫操作if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){qDebug()<<"文件打開失敗";}//向文件中寫入兩行字符串file.write("hello\r\n");file.write("world");//關閉文件file.close();//重新打開文件,對文件進行讀操作if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){qDebug()<<"文件打開失敗";}//每次都去文件中的一行,然后輸出讀取到的字符串char * str = new char[100];qint64 readNum = file.readLine(str,100);//當讀取出現錯誤(返回 -1)或者讀取到的字符數為 0 時,結束讀取while((readNum !=0) && (readNum != -1)){qDebug() << str;readNum = file.readLine(str,100);}file.close();return 0;
}
3.2實驗二【演示】

#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{//指定要寫入文件的數據qint32 nums[5]={1,2,3,4,5};//寫入文件之前,要將數據以二進制方式存儲到字節數組中QByteArray byteArr;byteArr.resize(sizeof(nums));for(int i=0;i<5;i++){//借助指針,將每個整數拷貝到字節數組中memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));}//將 byteArr 字節數組存儲到文件中QFile file("D:/demo.dat");file.open(QIODevice::WriteOnly);file.write(byteArr);file.close();//再次打開文件,讀取文件中存儲的二進制數據file.open(QIODevice::ReadOnly);QByteArray resArr = file.readAll();//輸出讀取到的二進制數據qDebug()<<"resArr: "<<resArr;//將二進制數據轉化為整數char* data = resArr.data();while(*data){qDebug() << *(qint32*)data;data += sizeof(qint32);}return 0;
}
執行程序,demo.dat 文件中會存儲 {1,2,3,4,5} 這 5 個整數的二進制形式,同時輸出以下內容:
4.QFile+QTextStream
與單獨使用QFile類相比,QTextStream類提供了很多讀寫文件相關的方法,還可以設定寫入到文件的數據格式,比如對齊方式,寫入數據是否帶前綴等等。
使用QTextStream類之前,程序中需要先引入 頭文件。QTextStream提供了很多構造方法,常用的有
am
與單獨使用QFile類相比,QTextStream類提供了很多讀寫文件相關的方法,還可以設定寫入到文件的數據格式,比如對齊方式,寫入數據是否帶前綴等等。
使用QTextStream類之前,程序中需要先引入 頭文件。QTextStream提供了很多構造方法,常用的有