一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - Qt QFile文件操作的具體使用

Qt QFile文件操作的具體使用

2022-03-08 15:12zx C/C++

很多應用程序都需要具備操作文件的能力,Qt 框架提供了 QFile 類專門用來操作文件。本文就來詳細的介紹一下,感興趣的可以了解一下

很多應用程序都需要具備操作文件的能力,包括對文件內容進行讀/寫、創建和刪除文件等,甚至某些應用程序的誕生純粹是為了操作文件,比如 WPS Office、PDFedit 等。為此,Qt 框架提供了 QFile 類專門用來操作文件。

QFile文件操作

QFile 類支持對文件進行讀取、寫入、刪除、重命名、拷貝等操作,它既可以操作文件文件,也可以操作二進制文件。

使用 QFile 類操作文件之前,程序中需引入<QFile>頭文件。創建 QFile 類的對象,常用的構造函數有:

?
1
2
QFile::QFile()
QFile::QFile(const QString &name)

參數 name 用來指定要操作的目標文件,包含文件的存儲路徑和文件名,存儲路徑可以使用絕對路徑(比如 "D:/Demo/test.txt")或者相對路徑(比如"./Demo/test.txt"),路徑中的分隔符要用 "/" 表示。

通常情況下,我們會調用第二個構造函數,直接指明要操作的文件。對于第一個構造函數創建的 QFile 對象,需要再調用 setFileName() 方法指明要操作的文件。

與 C++ 讀寫文件的規則一樣,使用 QFile 讀寫文件之前必須先打開文件,調用 open() 成員方法即可,常用的語法格式為:

?
1
bool QFile::open(OpenMode mode)

mode 參數用來指定文件的打開方式,下表羅列了此參數的可選值以及各自的含義:

打開方式 含 義
QIODevice::ReadOnly 只能對文件進行讀操作
QIODevice::WriteOnly 只能對文件進行寫操作,如果目標文件不存在,會自行創建一個新文件。
QIODevice::ReadWrite 等價于 ReadOnly | WriteOnly,能對文件進行讀和寫操作。
QIODevice::Append 以追加模式打開文件,寫入的數據會追加到文件的末尾(文件原有的內容保留)。
QIODevice::Truncate 以重寫模式打開,寫入的數據會將原有數據全部清除。注意,此打開方式不能單獨使用,通常會和 ReadOnly 或 WriteOnly 搭配。
QIODevice::Text 讀取文件時,會將行尾結束符(Unix 系統中是 "\n",Windows 系統中是 "\r\n")轉換成‘\n';將數據寫入文件時,會將行尾結束符轉換成本地格式,例如 Win32 平臺上是‘\r\n'。

表 1 QFile文件打開方式

根據需要,可以為 mode 參數一次性指定多個值,值和值之間用|分割。比如:

  • QIODevice::ReadOnly | QIODevice::Text:表示只允許對文件進行讀操作,讀取文件時,會將行尾結束符轉換為 '\n';
  • QIODevice::WriteOnly | QIODevice::Text:表示只允許對文件進行寫操作,將數據寫入文件時,會將行尾結束符轉換為本地格式;
  • QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text:表示對文件進行寫操作,寫入的數據會存放到文件的尾部,同時數據中的行尾結束符轉換為本地格式。

注意,傳遞給 mode 參數的多個值之間不能相互沖突,比如 Append 和 Truncate 不能同時使用。

如果文件成功打開,open() 函數返回 true,否則返回 false。

QFile 類提供了很多功能實用的方法,可以快速完成對文件的操作,下表列舉了常用的一些:

普通成員方法 功 能
qint64 QFile::size() const 獲取當前文件的大小。對于打開的文件,該方法返回文件中可以讀取的字節數。
bool QIODevice::getChar(char *c) 從文件中讀取一個字符,并存儲到 c 中。讀取成功時,方法返回 true,否則返回 false。
bool QIODevice::putChar(char c) 向文件中寫入字符 c,成功時返回 true,否則返回 false。
QByteArray QIODevice::read(qint64 maxSize) 從文件中一次性最多讀取 maxSize 個字節,然后返回讀取到的字節。
qint64 QIODevice::read(char *data, qint64 maxSize) 從文件中一次性對多讀取 maxSize 個字節,讀取到的字節存儲到 data 指針指定的內存控件中。該方法返回成功讀取到的字節數。
QByteArray QIODevice::readAll() 讀取文件中所有的數據。
qint64 QIODevice::readLine(char *data, qint64 maxSize) 每次從文件中讀取一行數據或者讀取最多 maxSize-1 個字節,存儲到 data 中。該方法返回實際讀取到的字節數。
qint64 QIODevice::write(const char *data, qint64 maxSize) 向 data 數據一次性最多寫入 maxSize 個字節,該方法返回實際寫入的字節數。 
qint64 QIODevice::write(const char *data) 將 data 數據寫入文件,該方法返回實際寫入的字節數。
qint64 QIODevice::write(const QByteArray &byteArray) 將 byteArray 數組中存儲的字節寫入文件,返回實際寫入的字節數。
bool QFile::copy(const QString &newName) 將當前文件的內容拷貝到名為 newName 的文件中,如果成功,方法返回 true,否則返回 false。

copy 方法在執行復制操作之前,會關閉源文件。
bool QFile::rename(const QString &newName) 對當前文件進行重命名,新名稱為 newName,成功返回 true,失敗返回 false。
bool QFile::remove() 刪除當前文件,成功返回 true,失敗返回 false。

表 2 QFile常用方法

【實例一】演示了 QFile 類讀寫文本文件的過程。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
    //創建 QFile 對象,同時指定要操作的文件
    QFile file("D:/demo.txt");
    //對文件進行寫操作
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug()<<"文件打開失敗";
    }
    //向文件中寫入兩行字符串
    file.write("C語言中文網\n");
    file.write("http://c.biancheng.net");
    //關閉文件
    file.close();
 
    //重新打開文件,對文件進行讀操作
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
        qDebug()<<"文件打開失敗";
    }
    //每次都去文件中的一行,然后輸出讀取到的字符串
    char * str = new char[100];
    qint64 readNum = file.readLine(str,100);
    //當讀取出現錯誤(返回 -1)或者讀取到的字符數為 0 時,結束讀取
    while((readNum !=0) && (readNum != -1)){
        qDebug() << str;
        readNum = file.readLine(str,100);
    }
    file.close();
    return 0;
}

執行程序,"C語言中文網" 和 "http://c.biancheng.net" 先寫入 D 盤的 demo.txt 文件,然后再從文件中將它們讀取出來。

【實例二】演示 QFile 讀寫二進制文件的過程。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
    //指定要寫入文件的數據
    qint32 nums[5]={1,2,3,4,5};
    //寫入文件之前,要將數據以二進制方式存儲到字節數組中
    QByteArray byteArr;
    byteArr.resize(sizeof(nums));
    for(int i=0;i<5;i++){
        //借助指針,將每個整數拷貝到字節數組中
        memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));
    }
    //將 byteArr 字節數組存儲到文件中
    QFile file("D:/demo.dat");
    file.open(QIODevice::WriteOnly);
    file.write(byteArr);
    file.close();
 
    //再次打開文件,讀取文件中存儲的二進制數據
    file.open(QIODevice::ReadOnly);
    QByteArray resArr = file.readAll();
    //輸出讀取到的二進制數據
    qDebug()<<"resArr: "<<resArr;
    //將二進制數據轉化為整數
    char* data = resArr.data();
    while(*data){
        qDebug() << *(qint32*)data;
        data += sizeof(qint32);
    }
    return 0;
}

執行程序,demo.dat 文件中會存儲 {1,2,3,4,5} 這 5 個整數的二進制形式,同時輸出以下內容:

resArr:  "\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00"

1

2

3

4

5

單獨使用 QFile 類讀寫文件的過程既繁瑣又復雜,Qt 提供了兩個輔助類 QTextStream 和 QDataStream,前者用來讀寫文件文件,后者用來讀寫二進制文件,QFile 可以和它們搭配使用,從整體上提高讀寫文件的開發效率。

QFile+QTextStream

和單獨使用 QFile 類讀寫文本文件相比,QTextStream 類提供了很多讀寫文件相關的方法,還可以設定寫入到文件中的數據格式,比如對齊方式、寫入數字是否帶前綴等等。

使用 QTextStream 類之前,程序中要先引入<QTextStream>頭文件。QTextStream 類提供了很多種構造函數,常用的是:

?
1
QTextStream(QIODevice *device)

QIODevice 是 QFile 的父類,因此在構造 QTextStream 類的對象時,需要傳遞一個 QFile 類的對象。

下表羅列了 QTextStream 類常用的一些方法:

成員方法 功 能
bool QTextStream::atEnd() const 判斷是否讀到文件末尾,如果已經達到末尾,返回 true,否則返回 false。
QString QTextStream::read(qint64 maxlen) 從文件中讀最多 maxlen 個字符,返回這些字符組成的 QString 字符串。
QString QTextStream::readAll() 從文件中讀取所有內容,返回由讀取內容組成的 QString 字符串。
QString QTextStream::readLine(qint64 maxlen = 0) 默認讀取一行文本,如果手動指定 maxlen 的值,則最多讀取 maxlen 個字符,并返回讀取內容組成的 QString 字符串。
void QTextStream::setFieldAlignment(FieldAlignment mode) 設置對齊方式,通常與 setFieldWidth() 一起使用。
void QTextStream::setFieldWidth(int width) 設置每份數據占用的位置寬度為 width。

表 3 QTextStream常用方法

QTextStream 類重載了>>輸入運算符和>>輸出運算符,使讀寫文本文件變得更簡單。例如,用 QTextStream 實現【實例一】的程序如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <QFile>
#include <QDebug>
#include <QString>
#include <QTextStream>
int main(int argc, char *argv[])
{
    //創建 QFile 對象,同時指定要操作的文件
    QFile file("D:/demo.txt");
    //對文件進行寫操作
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug()<<"文件打開失敗";
    }
    QTextStream out(&file);
    //向文件中寫入兩行字符串
    out << (QString)"C語言中文網\n" << (QString)"http://c.biancheng.net";
    //關閉文件
    file.close();
 
    //重新打開文件,對文件進行讀操作
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
        qDebug()<<"文件打開失敗";
    }
    QTextStream in(&file);
    //一直讀,直至讀取失敗
    while(!in.atEnd()){
        QString str;
        //從文件中讀取一個字符串
        in >> str;
        qDebug() << str;
    }
    file.close();
    return 0;
}

和<iostream>類似,QTextStream 類提供了兩種格式化輸出的方法,一種是調用該類的成員方法,例如表 3 中的 setFieldAlignment()、setFieldWidth 等,另一種是調用 QTextStream 類提供的格式描述符,下表羅列了常用的一些:

描述符 功能相同的方法 功 能
Qt::hex QTextStream::setIntegerBase(16) 將指定整數對應的 16 進制數寫入到文件中。
Qt::showbase QTextStream::setNumberFlags(numberFlags() | ShowBase) 對于非十進制數,寫入到文件中時帶上相應的前綴。二進制數前綴是 0b,八進制數前綴是 0,十六進制數前綴是 0x。
Qt::forcesign QTextStream::setNumberFlags(numberFlags() | ForceSign) 將數字寫入文件時,帶上正負號。
Qt::fixed QTextStream::setRealNumberNotation(FixedNotation) 將浮點數以普通小數的形式寫入文件。
Qt::scientific QTextStream::setRealNumberNotation(ScientificNotation) 將浮點數以科學計數法的形式寫入文件。
Qt::left QTextStream::setFieldAlignment(AlignLeft) 左對齊
Qt::right QTextStream::setFieldAlignment(AlignRight) 右對齊
Qt::center QTextStream::setFieldAlignment(AlignCenter) 居中對齊

表 4 QTextStream常用格式描述符

舉個簡單的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <QFile>
#include <QDebug>
#include <QString>
#include <QTextStream>
int main(int argc, char *argv[])
{
    QFile file("D:/demo.txt");
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug()<<"文件打開失敗";
    }
    QTextStream out(&file);
    //將 10 的十六進制數寫入文件
    out << hex << 10;
    //設置每份數據占用 10 個字符的位置
    out.setFieldWidth(10);
    //以右對齊的方式寫入 3.14
    out << left << 3.14;
    //后續數據以左對齊的方式寫入文件
    out.setFieldAlignment(QTextStream::AlignRight);
    out << 2.7;
    //關閉文件
    file.close();
    return 0;
}

程序運行后,demo.txt 存儲的文本內容為:

a3.14             2.7

QFile+QDataStream

QDataStream 類的用法和 QTextStream 非常類似,最主要的區別在于,QDataStream 用于讀寫二進制文件。

使用 QDataStream 類之前,程序中要引入<QDataStream>頭文件。創建 QDataStream 對象常用的構造函數為:

QDataStream::QDataStream(QIODevice *d)

下表羅列了 QDataStream 類常用的成員方法:

成員方法 功 能
bool QDataStream::atEnd() const 判斷是否讀到文件末尾,如果已經達到末尾,返回 true,否則返回 false。
QDataStream &QDataStream::readBytes(char *&s, uint &l) 對于用 writeBytes() 方法寫入文件的 l 和 s,只能使用 readBytes() 方法讀取出來。 
int QDataStream::readRawData(char *s, int len) 從文件中讀取最多 len 字節的數據到 s 中,返回值表示實際讀取的字節數。注意,調用該方法之前,需要先給 s 參數分配好內存空間。
void QDataStream::setVersion(int v) 不同版本的 Qt 中,同名稱的數據類型也可能存在差異,通過調用此方法手動指定版本號,可以確保讀取數據的一致性。
int QDataStream::skipRawData(int len) 跳過文件中的 len 個字節,返回實際跳過的字節數。
QDataStream &QDataStream::writeBytes(const char *s, uint len) 將長度 len 和 s 一起寫入到文件中,對于 writeBytes() 寫入的數據,只能用 readBytes() 方法讀取。
int QDataStream::writeRawData(const char *s, int len) 將 s 中前 len 字節的數據寫入文件,返回值表示成功寫入的字節數。

表 5 QDataStream常用方法

QDataStream 類也對<<和>>進行了重載,舉個簡單的例子,用 QDataStream 重新實現實例二:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <QFile>
#include <QDebug>
#include <QDataStream>
int main(int argc, char *argv[])
{
    //指定要寫入文件的數據
    qint32 nums[5]={1,2,3,4,5};
    QFile file("D:/demo.dat");
    file.open(QIODevice::WriteOnly);
    //創建 QDataStream 對象
    QDataStream out(&file);
    //將 nums 數組中的整數逐個寫入到二進制文件中
    for(int i=0;i<5;i++){
      out << nums[i];
    }
    file.close();
 
    //再次打開文件,讀取文件中存儲的二進制數據
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    //讀取二進制文件中的數據
    while(!in.atEnd()){
        //每次讀取一個整數
        qint32 num;
        in >> num;
        qDebug() << num;
    }
    return 0;
}

輸出結果為:

1

2

3

4

5

到此這篇關于Qt QFile文件操作的具體使用的文章就介紹到這了,更多相關Qt QFile文件操作內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:http://c.biancheng.net/view/9430.html

延伸 · 閱讀

精彩推薦
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 亚洲色图首页 | aaaa大片| 久久精品一区 | 欧美日韩国产中文字幕 | 99国内精品久久久久久久黑人 | 欧美丝袜foot job| 亚洲va韩国va欧美va天堂 | 国产在线成人a | 荡娃艳妇系列小说 | 国产a高清 | 久久re这里精品23 | 久久99影院 | 国产精品女同久久免费观看 | 高考录取率1977-2021 | 国产精品亚洲精品日韩已方 | 好骚好紧| 国产特级毛片aaaaaa | 亚洲va精品中文字幕 | 亚洲国产自拍在线 | 国产欧美视频高清va在线观看 | pron在线观看| 99视频久久| 成人在线播放 | 国产第一福利影院 | www.四虎在线观看 | 唯美清纯 自拍偷 | 波多野结衣中文字幕在线 | 欧美成人v视频免费看 | 亚洲精品久久中文字幕 | 国产乱插 | 日本xxxx69hd | 日本人妖在线 | 出轨同学会2在线观看 | 亚洲 欧美 另类 中文 在线 | 把老师操了 | 国产成人cao在线 | 久久偷拍国2017 | 欧美日韩一区二区三区在线观看 | yy8090韩国日本三理论免费 | 久久性综合亚洲精品电影网 | 动漫美丽妇人1~2在线看 |