天天看點

一篇文章快速搞懂Qt檔案讀寫操作

一篇文章快速搞懂Qt檔案讀寫操作

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

本文字數:1000,閱讀時長大約:10分鐘

一、檔案讀操作

(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();      

二、檔案寫操作

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

QString path = QFileDialog::getSaveFileName(this, "儲存"
                                                , "D:\\temp\\", "TXT(*.txt)");
    QFile file(path);
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    file.write("你好");
    file.close();      

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的幫助文檔。

推薦閱讀:

Qt信号與槽使用方法最完整總結

C++最好的圖形庫是什麼?

Linux快速搭建C/C++開發環境

擷取知識幹貨、增加面試經驗、了解職場人生

歡迎關注微信公衆号

一篇文章快速搞懂Qt檔案讀寫操作

繼續閱讀