激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

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

Qt QFile文件操作的具體使用

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

很多應(yīng)用程序都需要具備操作文件的能力,Qt 框架提供了 QFile 類專門(mén)用來(lái)操作文件。本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下

很多應(yīng)用程序都需要具備操作文件的能力,包括對(duì)文件內(nèi)容進(jìn)行讀/寫(xiě)、創(chuàng)建和刪除文件等,甚至某些應(yīng)用程序的誕生純粹是為了操作文件,比如 WPS Office、PDFedit 等。為此,Qt 框架提供了 QFile 類專門(mén)用來(lái)操作文件。

QFile文件操作

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

使用 QFile 類操作文件之前,程序中需引入<QFile>頭文件。創(chuàng)建 QFile 類的對(duì)象,常用的構(gòu)造函數(shù)有:

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

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

通常情況下,我們會(huì)調(diào)用第二個(gè)構(gòu)造函數(shù),直接指明要操作的文件。對(duì)于第一個(gè)構(gòu)造函數(shù)創(chuàng)建的 QFile 對(duì)象,需要再調(diào)用 setFileName() 方法指明要操作的文件。

與 C++ 讀寫(xiě)文件的規(guī)則一樣,使用 QFile 讀寫(xiě)文件之前必須先打開(kāi)文件,調(diào)用 open() 成員方法即可,常用的語(yǔ)法格式為:

?
1
bool QFile::open(OpenMode mode)

mode 參數(shù)用來(lái)指定文件的打開(kāi)方式,下表羅列了此參數(shù)的可選值以及各自的含義:

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

表 1 QFile文件打開(kāi)方式

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

  • QIODevice::ReadOnly | QIODevice::Text:表示只允許對(duì)文件進(jìn)行讀操作,讀取文件時(shí),會(huì)將行尾結(jié)束符轉(zhuǎn)換為 '\n';
  • QIODevice::WriteOnly | QIODevice::Text:表示只允許對(duì)文件進(jìn)行寫(xiě)操作,將數(shù)據(jù)寫(xiě)入文件時(shí),會(huì)將行尾結(jié)束符轉(zhuǎn)換為本地格式;
  • QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text:表示對(duì)文件進(jìn)行寫(xiě)操作,寫(xiě)入的數(shù)據(jù)會(huì)存放到文件的尾部,同時(shí)數(shù)據(jù)中的行尾結(jié)束符轉(zhuǎn)換為本地格式。

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

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

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

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

copy 方法在執(zhí)行復(fù)制操作之前,會(huì)關(guān)閉源文件。
bool QFile::rename(const QString &newName) 對(duì)當(dāng)前文件進(jìn)行重命名,新名稱為 newName,成功返回 true,失敗返回 false。
bool QFile::remove() 刪除當(dāng)前文件,成功返回 true,失敗返回 false。

表 2 QFile常用方法

【實(shí)例一】演示了 QFile 類讀寫(xiě)文本文件的過(guò)程。

?
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[])
{
    //創(chuàng)建 QFile 對(duì)象,同時(shí)指定要操作的文件
    QFile file("D:/demo.txt");
    //對(duì)文件進(jìn)行寫(xiě)操作
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug()<<"文件打開(kāi)失敗";
    }
    //向文件中寫(xiě)入兩行字符串
    file.write("C語(yǔ)言中文網(wǎng)\n");
    file.write("http://c.biancheng.net");
    //關(guān)閉文件
    file.close();
 
    //重新打開(kāi)文件,對(duì)文件進(jìn)行讀操作
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
        qDebug()<<"文件打開(kāi)失敗";
    }
    //每次都去文件中的一行,然后輸出讀取到的字符串
    char * str = new char[100];
    qint64 readNum = file.readLine(str,100);
    //當(dāng)讀取出現(xiàn)錯(cuò)誤(返回 -1)或者讀取到的字符數(shù)為 0 時(shí),結(jié)束讀取
    while((readNum !=0) && (readNum != -1)){
        qDebug() << str;
        readNum = file.readLine(str,100);
    }
    file.close();
    return 0;
}

執(zhí)行程序,"C語(yǔ)言中文網(wǎng)" 和 "http://c.biancheng.net" 先寫(xiě)入 D 盤(pán)的 demo.txt 文件,然后再?gòu)奈募袑⑺鼈冏x取出來(lái)。

【實(shí)例二】演示 QFile 讀寫(xiě)二進(jìn)制文件的過(guò)程。

?
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[])
{
    //指定要寫(xiě)入文件的數(shù)據(jù)
    qint32 nums[5]={1,2,3,4,5};
    //寫(xiě)入文件之前,要將數(shù)據(jù)以二進(jìn)制方式存儲(chǔ)到字節(jié)數(shù)組中
    QByteArray byteArr;
    byteArr.resize(sizeof(nums));
    for(int i=0;i<5;i++){
        //借助指針,將每個(gè)整數(shù)拷貝到字節(jié)數(shù)組中
        memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));
    }
    //將 byteArr 字節(jié)數(shù)組存儲(chǔ)到文件中
    QFile file("D:/demo.dat");
    file.open(QIODevice::WriteOnly);
    file.write(byteArr);
    file.close();
 
    //再次打開(kāi)文件,讀取文件中存儲(chǔ)的二進(jìn)制數(shù)據(jù)
    file.open(QIODevice::ReadOnly);
    QByteArray resArr = file.readAll();
    //輸出讀取到的二進(jìn)制數(shù)據(jù)
    qDebug()<<"resArr: "<<resArr;
    //將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為整數(shù)
    char* data = resArr.data();
    while(*data){
        qDebug() << *(qint32*)data;
        data += sizeof(qint32);
    }
    return 0;
}

執(zhí)行程序,demo.dat 文件中會(huì)存儲(chǔ) {1,2,3,4,5} 這 5 個(gè)整數(shù)的二進(jìn)制形式,同時(shí)輸出以下內(nèi)容:

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

單獨(dú)使用 QFile 類讀寫(xiě)文件的過(guò)程既繁瑣又復(fù)雜,Qt 提供了兩個(gè)輔助類 QTextStream 和 QDataStream,前者用來(lái)讀寫(xiě)文件文件,后者用來(lái)讀寫(xiě)二進(jìn)制文件,QFile 可以和它們搭配使用,從整體上提高讀寫(xiě)文件的開(kāi)發(fā)效率。

QFile+QTextStream

和單獨(dú)使用 QFile 類讀寫(xiě)文本文件相比,QTextStream 類提供了很多讀寫(xiě)文件相關(guān)的方法,還可以設(shè)定寫(xiě)入到文件中的數(shù)據(jù)格式,比如對(duì)齊方式、寫(xiě)入數(shù)字是否帶前綴等等。

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

?
1
QTextStream(QIODevice *device)

QIODevice 是 QFile 的父類,因此在構(gòu)造 QTextStream 類的對(duì)象時(shí),需要傳遞一個(gè) QFile 類的對(duì)象。

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

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

表 3 QTextStream常用方法

QTextStream 類重載了>>輸入運(yùn)算符和>>輸出運(yùn)算符,使讀寫(xiě)文本文件變得更簡(jiǎn)單。例如,用 QTextStream 實(shí)現(xiàn)【實(shí)例一】的程序如下:

?
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[])
{
    //創(chuàng)建 QFile 對(duì)象,同時(shí)指定要操作的文件
    QFile file("D:/demo.txt");
    //對(duì)文件進(jìn)行寫(xiě)操作
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug()<<"文件打開(kāi)失敗";
    }
    QTextStream out(&file);
    //向文件中寫(xiě)入兩行字符串
    out << (QString)"C語(yǔ)言中文網(wǎng)\n" << (QString)"http://c.biancheng.net";
    //關(guān)閉文件
    file.close();
 
    //重新打開(kāi)文件,對(duì)文件進(jìn)行讀操作
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
        qDebug()<<"文件打開(kāi)失敗";
    }
    QTextStream in(&file);
    //一直讀,直至讀取失敗
    while(!in.atEnd()){
        QString str;
        //從文件中讀取一個(gè)字符串
        in >> str;
        qDebug() << str;
    }
    file.close();
    return 0;
}

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

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

表 4 QTextStream常用格式描述符

舉個(gè)簡(jiǎn)單的例子:

?
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()<<"文件打開(kāi)失敗";
    }
    QTextStream out(&file);
    //將 10 的十六進(jìn)制數(shù)寫(xiě)入文件
    out << hex << 10;
    //設(shè)置每份數(shù)據(jù)占用 10 個(gè)字符的位置
    out.setFieldWidth(10);
    //以右對(duì)齊的方式寫(xiě)入 3.14
    out << left << 3.14;
    //后續(xù)數(shù)據(jù)以左對(duì)齊的方式寫(xiě)入文件
    out.setFieldAlignment(QTextStream::AlignRight);
    out << 2.7;
    //關(guān)閉文件
    file.close();
    return 0;
}

程序運(yùn)行后,demo.txt 存儲(chǔ)的文本內(nèi)容為:

a3.14             2.7

QFile+QDataStream

QDataStream 類的用法和 QTextStream 非常類似,最主要的區(qū)別在于,QDataStream 用于讀寫(xiě)二進(jìn)制文件。

使用 QDataStream 類之前,程序中要引入<QDataStream>頭文件。創(chuàng)建 QDataStream 對(duì)象常用的構(gòu)造函數(shù)為:

QDataStream::QDataStream(QIODevice *d)

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

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

表 5 QDataStream常用方法

QDataStream 類也對(duì)<<和>>進(jìn)行了重載,舉個(gè)簡(jiǎn)單的例子,用 QDataStream 重新實(shí)現(xiàn)實(shí)例二:

?
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[])
{
    //指定要寫(xiě)入文件的數(shù)據(jù)
    qint32 nums[5]={1,2,3,4,5};
    QFile file("D:/demo.dat");
    file.open(QIODevice::WriteOnly);
    //創(chuàng)建 QDataStream 對(duì)象
    QDataStream out(&file);
    //將 nums 數(shù)組中的整數(shù)逐個(gè)寫(xiě)入到二進(jìn)制文件中
    for(int i=0;i<5;i++){
      out << nums[i];
    }
    file.close();
 
    //再次打開(kāi)文件,讀取文件中存儲(chǔ)的二進(jìn)制數(shù)據(jù)
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    //讀取二進(jìn)制文件中的數(shù)據(jù)
    while(!in.atEnd()){
        //每次讀取一個(gè)整數(shù)
        qint32 num;
        in >> num;
        qDebug() << num;
    }
    return 0;
}

輸出結(jié)果為:

1

2

3

4

5

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 五月天影院,久久综合, | 成人视屏网站 | 黄色1级视频 | 神马顶级推理片免费看 | 国产精品久久国产精麻豆96堂 | av在线免费看网址 | 中文字幕一区二区三区久久 | 色综合久久久久久久久久久 | 久久男人视频 | 欧美xxxwww | 91一级毛片 | 久久久婷婷一区二区三区不卡 | 特级毛片免费视频 | 手机免费看一级片 | 国产午夜三级一区二区三桃花影视 | 精品国产乱码一区二区三区四区 | 国产一区二区三区四区五区精品 | 亚洲午夜在线 | 色黄视频免费观看 | 成人免费一区二区三区在线观看 | 91麻豆精品国产91久久久更新资源速度超快 | 国产精品视频1区 | 日韩欧美视频一区二区三区 | 精国产品一区二区三区 | 伊人yinren22综合网色 | 久久国产精品久久精品国产演员表 | videos真实高潮xxxx | 毛片免费看电影 | 久久久成人精品 | 国产女同疯狂激烈互摸 | 日本黄色免费播放 | 国产资源在线观看视频 | 九九热视频在线 | 一级电影免费看 | 中国成人在线视频 | 大学生一级毛片在线视频 | av成人免费在线观看 | 国产无限资源在线观看 | 99ri在线 | 狠狠色成色综合网 | 久久精品一二三区 |