<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                #(35):文件 文件操作是應用程序必不可少的部分。Qt 作為一個通用開發庫,提供了跨平臺的文件操作能力。從本章開始,我們來了解下 Qt 的文件以及輸入輸出的功能,也就是 I/O 系統。 Qt 通過`QIODevice`提供了對 I/O 設備的抽象,這些設備具有讀寫字節塊的能力。下面是 I/O 設備的類圖: Qt4 [![](https://box.kancloud.cn/2015-12-29_568232589e1ae.png)](http://files.devbean.net/images/2013/01/qt4-io-device.png) Qt5 [![](https://box.kancloud.cn/2015-12-29_56823258cfe47.png)](http://files.devbean.net/images/2013/01/qt5-io-device.png) 從上面的類圖可以看出,Qt4 和 Qt5 在 I/O 設備部分大同小異。只不過 Qt5 新增加了一個`QFileDevice`類。途中所涉及的類及其用途簡要說明如下: * `QIODevice`:所有 I/O 設備類的父類,提供了字節塊讀寫的通用操作以及基本接口; * `QFlie`:訪問本地文件或者嵌入資源; * `QTemporaryFile`:創建和訪問本地文件系統的臨時文件; * `QBuffer`:讀寫`QByteArray`; * `QProcess`:運行外部程序,處理進程間通訊; * `QAbstractSocket`:所有套接字類的父類; * `QTcpSocket:TCP`協議網絡數據傳輸; * `QUdpSocket`:傳輸 UDP 報文; * `QSslSocket`:使用 SSL/TLS 傳輸數據; * `QFileDevice:Qt5`新增加的類,提供了有關文件操作的通用實現。 這其中,`QProcess`、`QTcpSocket`、`QUdpSoctet`和`QSslSocket`是順序訪問設備。所謂“順序訪問”,是指它們的數據只能訪問一遍:從頭走到尾,從第一個字節開始訪問,直到最后一個字節,中途不能返回去讀取上一個字節;`QFile`、`QTemporaryFile`和`QBuffer`是隨機訪問設備,可以訪問任意位置任意次數,還可以使用`QIODevice::seek()`函數來重新定位文件訪問位置指針。 本章將主要介紹`QFile`及其相關類,后面的章節則開始介紹有關輸入輸出的流。 在所有的 I/O 設備中,文件 I/O 是最重要的部分之一。因為我們大多數的程序依舊需要首先訪問本地文件(當然,在云計算大行其道的將來,這一觀點可能改變)。`QFile`提供了從文件中讀取和寫入數據的能力。Qt5 新加入的`QFileDevice`類,則將這部分公共操作放到了這個單獨的類中。顯然,這部分代碼在 Qt4 中位于`QFile`類。這樣看來,Qt5 的代碼結構更為清晰,層次更好。 我們通常會將文件路徑作為參數傳給`QFile`的構造函數。不過也可以在創建好對象最后,使用`setFileName()`來修改。`QFile`需要使用 / 作為文件分隔符,不過,它會自動將其轉換成操作系統所需要的形式。例如 C:/windows 這樣的路徑在 Windows 平臺下同樣是可以的。 `QFile`主要提供了有關文件的各種操作,比如打開文件、關閉文件、刷新文件等。我們可以使用`QDataStream`或`QTextStream`類來讀寫文件,也可以使用`QIODevice`類提供的`read()`、`readLine()`、`readAll()`以及`write()`這樣的函數。值得注意的是,有關文件本身的信息,比如文件名、文件所在目錄的名字等,則是通過`QFileInfo`獲取,而不是自己分析文件路徑字符串。 下面我們使用一段代碼來看看`QFile`的有關操作: ~~~ int main(int argc, char *argv[]) { QApplication app(argc, argv); QFile file("in.txt"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Open file failed."; return -1; } else { while (!file.atEnd()) { qDebug() << file.readLine(); } } QFileInfo info(file); qDebug() << info.isDir(); qDebug() << info.isExecutable(); qDebug() << info.baseName(); qDebug() << info.completeBaseName(); qDebug() << info.suffix(); qDebug() << info.completeSuffix(); return app.exec(); } ~~~ 在這段代碼中,我們首先使用`QFile`創建了一個文件對象。這個文件名字是 in.txt。如果你不知道應該把它放在哪里,~~可以使用`app.applicationFilePath();`或者`app.applicationDirPath();`來獲得應用程序的執行路徑。只要將這個文件放在同執行路徑一致的目錄下即可。~~可以使用`QDir::currentPath()`來獲得應用程序執行時的當前路徑。只要將這個文件放在與當前路徑一致的目錄下即可。然后,我們使用`open()`函數打開這個文件,打開形式是只讀方式,文本格式。這個類似于`fopen()`的 r 這樣的參數。`open()`函數返回一個 bool 類型,如果打開失敗,我們在控制臺輸出一段提示然后程序退出。否則,我們利用 while 循環,將每一行讀到的內容輸出。 程序的第二部分,我們使用`QFileInfo`獲取有關該文件的信息。`QFileInfo`有很多類型的函數,我們只舉出一些例子。比如這里,`isDir()`檢查該文件是否是目錄;`isExecutable()`檢查該文件是否是可執行文件等。`baseName()`可以直接獲得文件名;`suffix()`則直接獲取文件后綴名。我們可以由下面的示例看到,`baseName()`和`completeBaseName()`,以及`suffix()`和`completeSuffix()`的區別: ~~~ QFileInfo fi("/tmp/archive.tar.gz"); QString base = fi.baseName(); // base = "archive" QString cbase = fi.completeBaseName(); // base = "archive.tar" QString ext = fi.suffix(); // ext = "gz" QString ext = fi.completeSuffix(); // ext = "tar.gz" ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看