引言
檔案的讀寫是很多應用程式具有的功能,甚至某些應用程式就是圍繞著某一種格式檔案的處 理而開發的,所以檔案讀寫是應用程式開發的一個基本功能。
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(); }