1. 程式人生 > 實用技巧 >如何瞭解Qt檔案讀寫操作?一篇文章快速搞懂

如何瞭解Qt檔案讀寫操作?一篇文章快速搞懂

Qt當中使用QFile類對檔案進行讀寫操作,對文字檔案也可以與QTextStream一起使用,這樣讀寫操作會更加簡便。QFileInfo可以用來獲取檔案的資訊。QDir可以用於對資料夾進行操作。

一、檔案讀操作

(1)使用QFile類

Qt封裝了QFile類,方便我們對檔案進行操作,可以按照如下的步驟進行:

使用QFile載入檔案物件

開啟檔案 file.open(開啟方式)

操作檔案

關閉檔案 file.close()

使用QFile首先用只讀方式開啟一個文字檔案,然後用readAll()方法將檔案內容一次全部讀取出來,返回值是位元組陣列QByteArray。QByteArray用來存放二進位制資料,如果想要看文字內容需要轉換成QString。

QString path = QFileDialog::getOpenFileName(this, "開啟檔案", "D:\\temp\\");

QFile file(path);

if(!file.open(QIODevice::ReadOnly | QIODevice::Text))

{

return;

}

QByteArray allArray = file.readAll();

QString allStr = QString(allArray);

file.close();

Qt預設使用utf-8的編碼方式,在Linux中一般沒有問題,因為Linux預設也是用utf-8。不過Windows裡一般用的是gb18030,所以除非我們明確將檔案儲存成utf-8編碼,否則在Qt程式碼裡需要對編碼做一些轉換操作:

QString path = QFileDialog::getOpenFileName(this, "開啟檔案", "D:\\temp\\");

QFile file(path);

if(!file.open(QIODevice::ReadOnly | QIODevice::Text))

{

return;

}

QByteArray allArray = file.readAll();

QTextCodec *codec = QTextCodec::codecForName("gb18030");

QString allStr = codec->toUnicode(allArray);

file.close();

我們也可以使用readLine方法一次讀取一行,然後每次對一行文字進行操作:

QString path = QFileDialog::getOpenFileName(this, "開啟檔案", "D:\\temp\\");

QFile file(path);

if(!file.open(QIODevice::ReadOnly | QIODevice::Text))

{

return;

}

while(!file.atEnd())

{

QByteArray array = file.readLine();

QString str = QString(array);

}

file.close();

(2)使用QTextStream類

如果操作的是文字檔案,Qt還專門封裝了一個處理文字流的類,我們可以一行一行的讀取文字內容

QString path = QFileDialog::getOpenFileName(this, "開啟檔案", "D:\\temp\\");

QFile file(path);

if(!file.open(QIODevice::ReadOnly | QIODevice::Text))

{

return;

}

QTextStream in(&file);

//in.setCodec("utf-8");

while (!in.atEnd())

{

QString line = in.readLine();

}

file.close();

二、檔案寫操作

(1)使用QFile類

使用QFile同樣可以對檔案進行寫操作:

QString path = QFileDialog::getSaveFileName(this, "儲存"

, "D:\\temp\\", "TXT(*.txt)");

QFile file(path);

file.open(QIODevice::WriteOnly | QIODevice::Text);

file.write("你好");

file.close();

(2)使用QTextStream類

QTextStream類對操作符進行了過載,我們可以通過 << 操作符將字串流入文字檔案:

QString path = QFileDialog::getSaveFileName(this, "儲存"

, "D:\\temp\\", "TXT(*.txt)");

QFile file(path);

file.open(QIODevice::WriteOnly | QIODevice::Text);

QTextStream out(&file);

QString str = "你好";

out << str;

file.close();

三、檔案資訊讀取

除了對檔案的讀寫操作,Qt還封裝了QFileInfo類幫助我們獲取檔案的元資料,比如檔案大小、字尾名、建立時間、最後修改時間等等:

QString path = QFileDialog::getOpenFileName(this, "開啟檔案", "D:\\temp\\");

QFileInfo file(path);

qDebug() << "檔名" << file.fileName();

qDebug() << "字尾名" << file.suffix();

qDebug() << "檔案大小" << file.size();

qDebug() << "建立日期" << file.birthTime().toString("yyyy/MM/dd hh:mm:ss");

qDebug() << "最後修改" << file.lastModified().toString("yyyy/MM/dd hh:mm:ss");

四、資料夾的操作

QDir類可以對路徑/資料夾/目錄進行操作(不同的系統有不同的名稱)。首先我們可以用QDir表示絕對路徑,比如:

QDir("/home/user/Documents")

QDir("C:/Documents and Settings")

也可以表示相對路徑,比如:

QDir("images/landscape.png")

我們可以用IsRelative()和IsAbsolute()方法來檢驗某個QDir物件使用的是絕對路徑還是相對路徑。不管用的是哪一種,兩者之間也可以相互轉化:

QDir directory("Documents/Letters");

QString path = directory.filePath("contents.txt");

QString absolutePath = directory.absoluteFilePath("contents.txt");

我們經常用到QDir的例子有比如檢查某個路徑是否存在:

QDir dir("example");

if (!dir.exists())

{

qWarning("Cannot find the example directory");

}

或者查詢某個路徑下的檔案:

QDir dir = QDir::root(); // "/"

if (!dir.cd("tmp")) // "/tmp"

{

qWarning("Cannot find the \"/tmp\" directory");

}

else

{

QFile file(dir.filePath("ex1.txt")); // "/tmp/ex1.txt"

if (!file.open(QIODevice::ReadWrite))

{

qWarning("Cannot create the file");

}

}

五、資料夾的操作

Qt對檔案和資料夾的操作封裝了很多類,比如對檔案操作可以使用QFile,文字檔案的讀寫可以使用QTextStream,讀取檔案元資料可以使用QFileInfo,資料夾的操作可以使用QDir等。這些類為開發者提供了極大的便利,還有很多方法本文不能一一介紹到,感興趣的讀者也可以查閱Qt的幫助文件。

最後,各位朋友如果有興趣或是想與我們一起學習計算機技術(軟體開發),可以關注我哦!這裡還有一些你可能不知道的趣事分享喲。