引言
文件的讀寫是很多應用程序具有的功能,甚至某些應用程序就是圍繞着某一種格式文件的處理而開發的,所以文件讀寫是應用程序開發的一個基本功能。
Qt 提供了兩種讀寫純文本文件的基本方法:
- 用 QFile 類的 IODevice 讀寫功能直接進行讀寫
- 利用 QFile 和 QTextStream 結合起來,用流(Stream)的方法進行文件讀寫。
一、文件讀操作
(1)使用QFile類
Qt封裝了QFile類,方便我們對文件進行操作,可以按照如下的步驟進行:
- 使用QFile加載文件對象
- 打開文件 file.open(打開方式)
- 操作文件
- 關閉文件 file.close()
實例:點擊讀寫文件按鈕,讀取文件內容到textEdit中
1️⃣設置ui界面

2️⃣在widget.cpp中編輯代碼(QFileDialog類是打開文件)
//點擊選取文件按鈕,彈出文件對話框 connect(ui->pushButton,&QPushButton::clicked,[=](){ QString path= QFileDialog::getOpenFileName(this,"打開文件","C:/Users/WFD/Desktop"); //將路徑顯示在lineEdit中 ui->lineEdit->setText(path); //讀取文件內容,放入textEdit中 QFile file(path);//參數就是文件的路徑 //設置打開方式 file.open(QIODevice::ReadOnly); //用QByteArray類去接收讀取的信息 QByteArray array=file.readAll(); //將讀取到的數據放入textEdit中 ui->textEdit->setText(array); //關閉文件對象 file.close();

注意:在設置打開方式的時候
QFile::open() 函數打開文件時需要傳遞 QIODevice::OpenModeFlag 枚舉類型的參數,決定文件以什么方式打開,QIODevice::OpenModeFlag 類型的主要取值如下:
QIODevice::ReadOnly //以只讀方式打開文件,用於載入文件。 QIODevice::WriteOnly //以只寫方式打開文件,用於保存文件。 QIODevice::ReadWrite //以讀寫方式打開。 QIODevice::Append //以添加模式打開,新寫入文件的數據添加到文件尾部。 QIODevice::Truncate //以截取方式打開文件,文件原有的內容全部被刪除。 QIODevice::Text //以文本方式打開文件,讀取時“\n”被自動翻譯為換行符,寫入時字符串結束符會自動翻譯為系統平台的編碼,如 Windows 平台下是“\r\n”。 這些取值可以組合,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只讀和文本方式打開文件。
注意:在操作文件時
用只讀方式打開一個文本文件,然后用readAll()方法將文件內容一次全部讀取出來,返回值是字節數組QByteArray。QByteArray用來存放二進制數據,如果想要看文字內容需要轉換成QString。(有時候系統會自動轉換)
我們也可以使用readLine方法一次讀取一行,然后每次對一行文字進行操作:(用file.atEnd判斷是否讀到最后一行)
QByteArray array; while(!file.atEnd()) { array+=file.readLine();//+=疊加讀過的行 }
(2)使用QTextStream類
如果操作的是文本文件,Qt還專門封裝了一個處理文本流的類,我們可以用它來讀取文本內容
//點擊選取文件按鈕,彈出文件對話框 connect(ui->pushButton,&QPushButton::clicked,[=](){ QString path= QFileDialog::getOpenFileName(this,"打開文件","C:/Users/WFD/Desktop"); //將路徑放在lineEdit中 ui->lineEdit->setText(path); //讀取文件內容,放入textEdit中 QFile file(path);//參數就是文件的路徑 //設置打開方式 file.open(QIODevice::ReadOnly); //用QTextStream類去讀取文本信息 QTextStream QS(&file); //用QString類去接收讀取的信息 QString array=QS.readAll(); //將讀取到的數據放入textEdit中 ui->textEdit->setText(array); //關閉文件對象 file.close();
二,文件寫操作
(1)使用QFile類
使用QFile同樣可以對文件進行寫操作:

(2)使用QTextStream類
QTextStream類對操作符進行了重載,我們可以通過 << 操作符將字符串流入文本文件:

三,文件信息讀取
除了對文件的讀寫操作,Qt還封裝了QFileInfo類幫助我們獲取文件的元數據,比如文件大小、后綴名、創建時間、最后修改時間等等:

拓展:
- 各編碼轉換
QString -> QByteArray QString.toUtf8(); QByteArray -> std::string QByteArray.toStdString(); std::string -> char * string.date();
- 常用靜態函數
QFileDialog::getOpenFileName() //獲取指定文件路徑名返回QString QFileDialog::getExistingDirectory() //獲取指定路徑返回QString QFileDialog::getSaveFileName() //獲取指定保存路徑名返回QString
QT配置ini文件的建立,讀取,寫入操作
1 ini文件介紹
.ini 文件是Initialization File的縮寫,即初始化文件。
除了windows現在很多其他操作系統下面的應用軟件也有.ini文件,用來配置應用軟件以實現不同用戶的要求。一般不用直接編輯這些.ini文件,應用程序的圖形界面即可操作以實現相同的功能。它可以用來存放軟件信息,注冊表信息等。
2 ini文件格式
INI文件由節、鍵、值組成。
節 [section] 參數(鍵=值) name=value
下面是一個ini文件的例子
[Section1 Name] KeyName1=value1 KeyName2=value2 ... [Section2 Name] KeyName21=value21 KeyName22=value22
其中:[Section1 Name]用來表示一個段落。因為INI文件可能是項目中共用的,所以使用[Section Name]段名來區分不同用途的參數區。例如:[Section1 Name]表示傳感器靈敏度參數區;[Section2 Name]表示測量通道參數區等等。
注解:使用分號表示(;)。在分號后面的文字,直到該行結尾都全部為注解。
3 Qt寫ini文件
#include <QApplication> #include <QSettings> int main(int argc, char *argv[]) { QApplication a(argc, argv); //Qt中使用QSettings類讀寫ini文件 //QSettings構造函數的第一個參數是ini文件的路徑,第二個參數表示針對ini文件,第三個參數可以缺省 QSettings *configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat); //向ini文件中寫入內容,setValue函數的兩個參數是鍵值對 //向ini文件的第一個節寫入內容,ip節下的第一個參數 configIniWrite->setValue("/ip/first", "192.168.0.1"); //向ini文件的第一個節寫入內容,ip節下的第二個參數 configIniWrite->setValue("ip/second", "127.0.0.1"); //向ini文件的第二個節寫入內容,port節下的第一個參數 configIniWrite->setValue("port/open", "2222"); //寫入完成后刪除指針 delete configIniWrite; return a.exec(); }
運行程序后,打開程序目錄下的hahaya.ini文件,結果如下圖所示:

4 Qt讀ini文件
#include <QApplication> #include <QSettings> #include<QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); QSettings *configIniRead = new QSettings("hahaya.ini", QSettings::IniFormat); //將讀取到的ini文件保存在QString中,先取值,然后通過toString()函數轉換成QString類型 QString ipResult = configIniRead->value("/ip/second").toString(); QString portResult = configIniRead->value("/port/open").toString(); //打印得到的結果 qDebug() << ipResult; qDebug() << portResult; //讀入入完成后刪除指針 delete configIniRead; return a.exec(); }

