一篇文章快速搞懂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();

 

 

二、文件寫操作

 

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

 

 

 

推薦閱讀:

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

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

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

 

 

 

 

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

歡迎關注微信公眾號

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM