天天看點

從零開始學Qt(51):QFile讀寫文本檔案

作者:未來奇兵

檔案的讀寫是很多應用程式具有的功能,甚至某些應用程式就是圍繞着某一種格式檔案的處 理而開發的,是以檔案讀寫是應用程式開發的一個基本功能。

文本檔案是指以純文字格式存儲的檔案,例如用Qt Creator編寫的C++程式的頭檔案(.h檔案)和源程式檔案(.cpp檔案),HTML和XML檔案也是純文字檔案,隻是其讀取之後需要對内容進行解析之後再顯示。

Qt提供了兩種讀寫純文字檔案的基本方法,一種是用QFile類的IODevice讀寫功能直接進行讀寫,另—種是利用QFile和QTextStream結合起來,用流(stream)的方法進行檔案讀寫。

本文以執行個體的方式示範了利用QFile直接讀寫文本檔案,其運作時視窗如下圖所示。執行個體不僅示範了如何打開文本檔案,還有檔案儲存功能。

從零開始學Qt(51):QFile讀寫文本檔案

QFiIe讀取文本檔案

QFile類是直接與IO裝置打交道,進行檔案讀寫操作的類,使用QFile可以直接打開或儲存文本檔案。工具欄上的“QFile打開”按鈕用QFile類的功能直接打開文本檔案,按鈕的槽函數及相關函數的代碼如下:

void MainWindow::on_actionOpen_triggered()
{ //打開檔案
  QString curPath=QDir::currentPath();
  QString dlgTitle="打開一個檔案";
  QString filter="程式檔案(*.h *.cpp);;文本檔案(*.txt);;所有檔案(*.*)";
  QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
  if(aFileName.isEmpty())
  	return;
  openTextByIODevice(aFileName);
}           
bool MainWindow::openTextByIODevice(const QString &aFileName)
{//用IODevice方式打開文本檔案
  QFile aFile(aFileName);
  if(!aFile.exists())//檔案不存在
  	return false;
  if(!aFile.open(QIODevice::ReadOnly | QIODevice::Text))
  	return false;
  ui->textEditDevice->setPlainText(aFile.readAll());
  aFile.close();
  return true;
}           

自定義函數openTextByIODevice()實作文本檔案打開的功能。定義QFile對象變量aFile時将 檔案名傳遞給它,檢查檔案存在後,通過open()函數打開檔案。

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表示以隻讀和文本方式打 開檔案。

将檔案内容全部讀出并設定為QPlainTextEdit元件的内容隻需一條語句:

ui->textEditDevice->setPlainText(aFile.readAll());           

檔案内容讀取結束後,需要調用QFile::close()函數關閉檔案。

QFile儲存文本檔案

工具欄上的“QFile另存”按鈕用QFile類的功能将QPlaintextEdit元件中的文本儲存為一個文本檔案,實作代碼如下:

void MainWindow::on_actionSave_triggered()
{
  QString curPath=QDir::currentPath();
  QString dlgTitle="另存為一個檔案";
  QString filter=".h檔案(*.h);;C++檔案(*.cpp);;所有檔案(*.*)";
  QString aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
  if(aFileName.isEmpty())
  	return;
  saveTextByIODevice(aFileName);
}           
bool MainWindow::saveTextByIODevice(const QString &aFileName)
{ //用IODevice方式儲存文本檔案
  QFile aFile(aFileName);
  if(!aFile.open(QIODevice::WriteOnly | QIODevice::Text))
  	return false;
  QString str=ui->textEditDevice->toPlainText();//整個内容作為字元串
  QByteArray strBytes=str.toUtf8();//轉換為位元組數組
  aFile.write(strBytes,strBytes.length()); //寫入檔案
  aFile.close();
  return true;
}           

自定義函數saveTextBylODevice()實作檔案儲存功能,為了儲存檔案,用open()打開檔案時, 使用的模式是 QIODevice::WriteOnly | QIODevice::Text。使用 WriteOnly 隐含着 Truncate,即删除檔案原有内容。

首先将QPlaintextEdit元件textEditDevice的文本導出為一個字元串,将QString類的toUtf8() 函數轉換為UTF8編碼的位元組數組strBytes,然後調用QFile::write()函數将位元組數組内容寫入檔案。

繼續閱讀