欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT使用QFile進(jìn)行文件操作

 更新時(shí)間:2022年08月22日 09:47:35   作者:求道玉  
本文主要介紹了QT使用QFile進(jìn)行文件操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

QFile類我我們提供了操作文件的常用功能。它是一種io設(shè)備,可以用來讀寫文本文件和二進(jìn)制文件,也可以用來讀寫Qt的資源文件。QFile類可以單獨(dú)使用,該類本身提供了read/write函數(shù),但更方便的方式是,將QFile和QTextStream或QDataStream一起使用。

一般情況下,使用QFile創(chuàng)建對(duì)象時(shí),就會(huì)把要操作的文件名傳遞給它。但該類也提供了一個(gè)setFileName() 方法,允許我們?cè)谌魏螘r(shí)候?yàn)镼File對(duì)象設(shè)置要操作的文件名。但是,QFile 只支持"/",不支持"\"。

在構(gòu)造QFile的對(duì)象后,我們可以使用exists() 判斷文件是否存在,使用remove() 刪除一個(gè)文件。在進(jìn)行實(shí)際的內(nèi)容讀寫前,需調(diào)用open()打開文件,讀寫結(jié)束后,要調(diào)用close()關(guān)閉文件,也可以寫調(diào)用一下flush(),沖刷緩沖區(qū)。就向我們剛才說的,我們一般使用QDataStream或QTextStream 讀寫文件,但我們也可以使用QFile繼承自QIODevice的函數(shù),如read()、readLine()、readAll()、write()等。除了讀寫函數(shù)外,我們還能使用size() 函數(shù)獲得文件的大小;使用pos() 或 seek() 函數(shù)獲取及設(shè)置文件讀寫的位置;使用atEnd() 函數(shù)判斷是否到達(dá)了文件結(jié)尾。

直接使用QFile讀寫文件

      QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;
 
      while (!file.atEnd()) {
          QByteArray line = file.readLine();
          process_line(line);
      }

在此,我們將QIODevice::Text傳給了open()函數(shù),該標(biāo)志是用來告訴Qt將文件中的換行符由"\r\n",轉(zhuǎn)換成"\n"。因?yàn)?,默認(rèn)情況下,QFile把文件當(dāng)做二進(jìn)制進(jìn)行讀寫,不會(huì)進(jìn)行任何的字節(jié)轉(zhuǎn)換。

使用流讀取文件:

      QFile file("in.txt");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;
 
      QTextStream in(&file);
      while (!in.atEnd()) {
          QString line = in.readLine();
          process_line(line);
      }

QTextStream會(huì)把存儲(chǔ)在磁盤上的8bit數(shù)據(jù)轉(zhuǎn)換為16bit的Unicode 字符串QString。默認(rèn)情況下,QTextStream假定文件使用的是用戶系統(tǒng)的本地8bit編碼。我們也可以使用QTextStream::setCodec() 函數(shù)還改變這種行為。
當(dāng)使用QFile,QFileInfo和QDir類去操作文件系統(tǒng)時(shí),你可以使用Unicode編碼的文件名。在Unix平臺(tái)上,這些文件名會(huì)被轉(zhuǎn)換成8-bit編碼。但如果你想使用標(biāo)準(zhǔn)c++ API或者平臺(tái)特定的API去訪問文件,那么你可以使用encodeName() 和 decodeName() 函數(shù)在Unicode文件名和8-bit文件名之間進(jìn)行轉(zhuǎn)換。

在Unix平臺(tái)下,存在一些特殊的系統(tǒng)文件,例如/proc目錄下,對(duì)這個(gè)文件調(diào)用size() 總是返回0,然而,你還是能夠從此類文件中讀取到數(shù)據(jù);這些數(shù)據(jù)是為了相應(yīng)你的read() 函數(shù)而間接產(chǎn)生出來的。但是,在這種情況下,你不能使用atEnd() 來判斷是否還有數(shù)據(jù)可讀(因?yàn)閍tEnd() 對(duì)于大小為0的文件返回true)。相反,你應(yīng)該調(diào)用readAll(),或 反復(fù)調(diào)用read()、readLine()知道沒有數(shù)據(jù)可讀為止。如下代碼所示,我們使用QTextStream一行一行的讀取/proc/modules文件:

      QFile file("/proc/modules");
      if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
          return;
 
      QTextStream in(&file);
      QString line = in.readLine();
      while (!line.isNull()) {
          process_line(line);
          line = in.readLine();
      }

其實(shí),除了上面使用的QFile從QIODevice繼承的open() 函數(shù)外,QFile本身也為我們提供了兩個(gè)open() 函數(shù):

bool open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
bool open(int fd, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)

第一個(gè)open() 會(huì)按一定的模式打開一個(gè)現(xiàn)存的文件指針。同時(shí),可以再指定額外的標(biāo)志。如下代碼所示:

  #include <stdio.h>
 
  void printError(const char* msg)
  {
      QFile file;
      file.open(stderr, QIODevice::WriteOnly);
      file.write(msg, qstrlen(msg));        // write to stderr
      file.close();
  }

當(dāng)一個(gè)QFile已這種方式打開時(shí),那么后續(xù)的close() 函數(shù)的作用會(huì)受到AutoCloseHandle標(biāo)志的影響。如果指定了該標(biāo)志,并且這個(gè)open() 函數(shù)調(diào)用成功了,那么后續(xù)再Q(mào)File對(duì)象上調(diào)用close() 會(huì)關(guān)閉底層文件句柄。否則,若沒指定這個(gè)標(biāo)志,close()函數(shù)不會(huì)真正的關(guān)閉底層文件句柄,而只是沖刷 了一下緩沖區(qū)。如下測(cè)試代碼所示:

#include <QCoreApplication>
#include <QFile>
#include <cstdio>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    FILE *pf = fopen("test.txt", "wb");
    if(pf == nullptr)
        return 0;
    QFile file;
    file.open(pf, QIODevice::WriteOnly); //1
    //file.open(pf, QIODevice::WriteOnly, QFileDevice::AutoCloseHandle); //2
    file.write("hello");
    file.close();
    fwrite("world", strlen("world"), 1, pf);
 
    return a.exec();
}

當(dāng)我們使用 1處的方式打開文件指針,即不指定AutoCloseHandle標(biāo)志,則close() 函數(shù)后的“world”是可以繼續(xù)被寫入文件的;若使用2處的方式打開文件指針,則“world”并不會(huì)再被寫入文件,因?yàn)榈讓游募殃P(guān)閉。

第二個(gè)open() 函數(shù)與此類似,只不過其是按一定模式打開一個(gè)現(xiàn)存的文件描述符。AutoCloseHandle標(biāo)志也會(huì)影響后續(xù)的close()函數(shù)。同時(shí),如果QFile已這種方式打開,那么它會(huì)被自動(dòng)地設(shè)置為raw mode,這意味著文件的輸入、輸出函數(shù)的執(zhí)行會(huì)變慢。如果你遇到了性能問題,你應(yīng)該嘗試使用其他的打開函數(shù)。

至于其他的成員函數(shù),比如文件的刪除、重命名,文件訪問權(quán)限的設(shè)置,Qt的幫助文檔已講的很清除,大家可以在使用時(shí)隨時(shí)查看即可。

到此這篇關(guān)于QT使用QFile進(jìn)行文件操作的文章就介紹到這了,更多相關(guān)QT QFile文件操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java C++題解leetcode915分割數(shù)組示例

    Java C++題解leetcode915分割數(shù)組示例

    這篇文章主要為大家介紹了Java C++題解leetcode915分割數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • C++二維數(shù)組螺旋加密信息

    C++二維數(shù)組螺旋加密信息

    大家好,本篇文章主要講的是C++二維數(shù)組螺旋加密信息,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 詳解C/C++中const限定符總結(jié)

    詳解C/C++中const限定符總結(jié)

    const是一種限定符,被const所限定的變量其值不可以被改變。。這篇文章主要介紹了C/C++中const限定符總結(jié),通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • OLEDB打開Excel文件的實(shí)現(xiàn)方法

    OLEDB打開Excel文件的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狾LEDB打開Excel文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的圖文教程

    VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的圖文教程

    這篇文章主要給大家介紹了關(guān)于VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的相關(guān)資料,文中通過圖文將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用VC++6.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • C語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法

    C語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狢語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++實(shí)現(xiàn)簡(jiǎn)單的信息管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單的信息管理系統(tǒng)

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)簡(jiǎn)單的信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • C語言編程入門之程序頭文件的簡(jiǎn)要解析

    C語言編程入門之程序頭文件的簡(jiǎn)要解析

    這篇文章主要介紹了C語言編程入門之程序頭文件的簡(jiǎn)要解析,包括頭文件重復(fù)包含問題等方面的說明,需要的朋友可以參考下
    2015-12-12
  • C++深入探究重載重寫覆蓋的區(qū)別

    C++深入探究重載重寫覆蓋的區(qū)別

    C++ 允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),借助重載,一個(gè)函數(shù)名可以有多種用途
    2022-08-08
  • 深入解讀C++ 內(nèi)聯(lián)函數(shù)inline|nullptr

    深入解讀C++ 內(nèi)聯(lián)函數(shù)inline|nullptr

    內(nèi)聯(lián)函數(shù):用** inline 修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時(shí)C++編譯器會(huì)在調(diào)用的地方展開內(nèi)聯(lián)函數(shù)**,這樣調(diào)用內(nèi)聯(lián)函數(shù)就需要?jiǎng)?chuàng)建棧楨,就提高效率了,這篇文章給大家介紹C++ 內(nèi)聯(lián)函數(shù)inline|nullptr的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2024-07-07

最新評(píng)論