日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Qt文件系统

發布時間:2024/4/11 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt文件系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Qt文件系統

文章目錄

    • Qt文件系統
    • 1. 基本文件操作
    • 2.獲取文件信息
    • 3.QDataStream&QTextStream

文件操作是應用程序必不可少的部分。Qt 作為一個通用開發庫,提供了跨平臺的文件操作能力。Qt 通過QIODevice提供了對 I/O 設備的抽象,這些設備具有讀寫字節塊的能力。下面是 I/O 設備的類圖(Qt5):

  • ?QIODevice:所有 I/O 設備類的父類,提供了字節塊讀寫的通用操作以及基本接口;
  • QFileDevice:Qt5新增加的類,提供了有關文件操作的通用實現。
  • QFlie:訪問本地文件或者嵌入資源;
  • QTemporaryFile:創建和訪問本地文件系統的臨時文件;
  • QBuffer:讀寫QbyteArray, 內存文件;
  • QProcess:運行外部程序,處理進程間通訊;
  • QAbstractSocket:所有套接字類的父類;
  • QTcpSocket:TCP協議網絡數據傳輸;
  • QUdpSocket:傳輸 UDP 報文;
  • QSslSocket:使用 SSL/TLS 傳輸數據;

文件系統分類:

  • 順序訪問設備:

是指它們的數據只能訪問一遍:從頭走到尾,從第一個字節開始訪問,直到最后一個字節,中途不能返回去讀取上一個字節,這其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是順序訪問設備。

  • 隨機訪問設備:

可以訪問任意位置任意次數,還可以使用QIODevice::seek()函數來重新定位文件訪問位置指針,QFile、QTemporaryFile和QBuffer是隨機訪問設備,

1. 基本文件操作

文件操作是應用程序必不可少的部分。Qt 作為一個通用開發庫,提供了跨平臺的文件操作能力。在所有的 I/O 設備中,文件 I/O 是最重要的部分之一。因為我們大多數的程序依舊需要首先訪問本地文件(當然,在云計算大行其道的將來,這一觀點可能改變)。QFile提供了從文件中讀取和寫入數據的能力。

我們通常會將文件路徑作為參數傳給QFile的構造函數。不過也可以在創建好對象最后,使用setFileName()來修改。QFile需要使用 / 作為文件分隔符,不過,它會自動將其轉換成操作系統所需要的形式。例如 C:/windows 這樣的路徑在 Windows 平臺下同樣是可以的。

QFile主要提供了有關文件的各種操作,比如打開文件、關閉文件、刷新文件等,注意默認只識別utf8。我們可以使用QDataStream或QTextStream類來讀寫文件,也可以使用QIODevice類提供的read()、readLine()、readAll()以及write()這樣的函數。值得注意的是,有關文件本身的信息,比如文件名、文件所在目錄的名字等,則是通過QFileInfo獲取,而不是自己分析文件路徑字符串。

//讀文件 void Widget::on_buttonRead_clicked() {//設定文件對話框,并獲取文件路徑及文件名QString path = QFileDialog::getOpenFileName(this,"open","../");if(path.isEmpty() == false){//關聯file對象和文件QFile file(path);//以只讀的方式打開文件bool ret = file.open(QIODevice::ReadOnly);if(ret == true){ #if 0//一次全部讀取QByteArray arr = file.readAll();//把讀取的結果放到編輯器ui->textEdit->setText(arr); #endif//定義字節數組QByteArray arr;while(file.atEnd() == false){//一次讀取一行arr += file.readLine();}ui->textEdit->setText(arr);}file.close();} }//寫文件操作 void Widget::on_buttonWrite_clicked() {//設定保存文件的路徑QString path = QFileDialog::getSaveFileName(this,"save","../","TXT(.*txt");if(path.isEmpty() == false){//創建文件對象QFile file;file.setFileName("text");//以只寫的方式打開文件bool ret = file.open(QIODevice::WriteOnly);if(ret == true){ //獲取編輯器的內容QString str = ui->textEdit->toPlainText();//把內容寫入到文件//file.write(str.toUtf8());file.write(str.toStdString().c_str());}file.close();} }

幾種常見的轉換:

//Qstring -> QByteArrayQString buf = "abc";QByteArray Qbuf = buf.toUtf8();//QByteArray -> char*char* chs = Qbuf.data();//char* -> QStringQString qs = QString(chs);//QString -> char*chch = qs.toStdString().c_str();

2.獲取文件信息

QFileInfo fileinfo(path);qDebug()<<"filename"<<fileinfo.fileName();qDebug()<<"filesufix"<<fileinfo.suffix();qDebug()<<"size"<<fileinfo.size();qDebug()<<"create time"<<fileinfo.created().toString("yyyy-MM-dd hh:mm:ss");

3.QDataStream&QTextStream

  • QDataStream提供了基于QIODevice的二進制數據的序列化
  • 數據流是一種二進制流,這種流完全不依賴于底層操作系統、CPU 或者字節順序(大端或小端)。例如,在安裝了 Windows 平臺的 PC 上面寫入的一個數據流,可以不經過任何處理,直接拿到運行了 Solaris 的 SPARC 機器上讀取。
  • 由于數據流就是二進制流,因此我們也可以直接讀寫沒有編碼的二進制數據,例如圖像、視頻、音頻等。
  • QDataStream既能夠存取 C++ 基本類型,如 int、char、short 等,也可以存取復雜的數據類型,例如自定義的類。實際上,QDataStream對于類的存儲,是將復雜的類分割為很多基本單元實現的。
  • 結合QIODevice,QDataStream可以很方便地對文件、網絡套接字等進行讀寫操作。我們從代碼開始看起:
QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); out << QString("the answer is"); out << (qint32)42;
  • 在這段代碼中,我們首先打開一個名為 file.dat 的文件(注意,我們為簡單起見,并沒有檢查文件打開是否成功,這在正式程序中是不允許的)。
  • 然后,我們將剛剛創建的file對象的指針傳遞給一個QDataStream實例out。類似于std::cout標準輸出流,QDataStream也重載了輸出重定向<<運算符。
  • 后面的代碼就很簡單了:將“the answer is”和數字 42 輸出到數據流。由于我們的 out 對象建立在file之上,因此相當于將問題和答案寫入file。
  • 需要指出一點:最好使用 Qt 整型來進行讀寫,比如程序中的qint32。這保證了在任意平臺和任意編譯器都能夠有相同的行為。
  • 如果你直接運行這段代碼,你會得到一個空白的 file.dat,并沒有寫入任何數據。這是因為我們的file沒有正常關閉。為性能起見,數據只有在文件關閉時才會真正寫入。因此,我們必須在最后添加一行代碼:
file.close(); // 如果不想關閉文件,可以使用 file.flush(); 接下來我們將存儲到文件中的答案取出來 QFile file("file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(&file); QString str; qint32 a; in >> str >> a;
  • 唯一需要注意的是,你必須按照寫入的順序,將數據讀取出來。順序顛倒的話,程序行為是不確定的,嚴重時會直接造成程序崩潰。
  • 那么,既然QIODevice提供了read()、readLine()之類的函數,為什么還要有QDataStream呢?QDataStream同QIODevice有什么區別?
  • 區別在于,QDataStream提供流的形式,性能上一般比直接調用原始 API 更好一些。我們通過下面一段代碼看看什么是流的形式:
QFile file("file.dat"); file.open(QIODevice::ReadWrite);QDataStream stream(&file); QString str = "the answer is 42";stream << str;

QTextStream:

  • 二進制文件比較小巧,卻不是人可讀的格式。而文本文件是一種人可讀的文件。為了操作這種文件,我們需要使用QTextStream類
  • QTextStream和QDataStream的使用類似,只不過它是操作純文本文件的。
  • QTextStream會自動將 Unicode 編碼同操作系統的編碼進行轉換,這一操作對開發人員是透明的。它也會將換行符進行轉換,同樣不需要自己處理
  • QTextStream使用 16 位的QChar作為基礎的數據存儲單位,同樣,它也支持 C++ 標準類型,如 int 等。實際上,這是將這種標準類型與字符串進行了相互轉換。
void Widget::writeTextDate() {QFile file;file.setFileName("./1.txt");bool ret = file.open(QIODevice::WriteOnly);if(ret == true){QTextStream stream(&file);stream<<QString("i am text textStream");file.close();} }void Widget::readTextDate() {QFile file;file.setFileName("./1.txt");readDate();bool ret = file.open(QIODevice::ReadOnly);if(ret == true){QTextStream stream(&file);stream.setCodec("UTF-8");QString str;stream>>str;qDebug()<<str.toStdString().c_str();file.close();} }

總結

以上是生活随笔為你收集整理的Qt文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。