網(wǎng)絡(luò)營(yíng)銷中自建網(wǎng)站平臺(tái)推廣方式
在Qt中,QFile
、QByteArray
、QDataStream
和QTextStream
是常用的文件和數(shù)據(jù)處理類。
主要功能和區(qū)別
QFile
:
QFile
是用于讀寫文本和二進(jìn)制文件以及資源的I/O設(shè)備??梢詥为?dú)使用QFile
,或者更方便地與QTextStream
或QDataStream
一起使用。
通常在構(gòu)造函數(shù)中傳入文件名,但也可以隨時(shí)使用setFileName()
進(jìn)行設(shè)置。QFile
期望文件分隔符為’/‘,不論操作系統(tǒng)為何。不支持使用分隔符(例如’')。
可以使用exists()
檢查文件是否存在,并使用remove()
刪除文件。(更高級(jí)的文件系統(tǒng)相關(guān)操作由QFileInfo
和QDir
提供。)
文件使用open()
打開,使用close()
關(guān)閉,并使用flush()
刷新。通常使用QDataStream
或QTextStream
進(jìn)行數(shù)據(jù)的讀取和寫入,但也可以使用QIODevice
繼承的函數(shù)read()
、readLine()
、readAll()
、write()
進(jìn)行操作。QFile還繼承了getChar()、putChar()和ungetChar(),可以逐個(gè)字符地進(jìn)行操作。
使用size()可以獲取文件的大小??梢允褂胮os()獲取當(dāng)前文件位置,或者使用seek()移動(dòng)到新的文件位置。如果已經(jīng)到達(dá)文件末尾,atEnd()返回true。
QByteArray
:
QByteArray
類提供了一個(gè)字節(jié)數(shù)組。
QByteArray
可用于存儲(chǔ)原始字節(jié)(包括’\0’)和傳統(tǒng)的8位’\0’終止的字符串。使用QByteArray
比使用const char *
更方便。在幕后,它始終確保數(shù)據(jù)后跟’\0’終止符,并使用隱式共享(寫時(shí)復(fù)制)來減少內(nèi)存使用和避免無謂的數(shù)據(jù)復(fù)制。
除了QByteArray
,Qt還提供了QString類用于存儲(chǔ)字符串?dāng)?shù)據(jù)。對(duì)于大多數(shù)情況,應(yīng)使用QString類。它存儲(chǔ)16位Unicode字符,使得在應(yīng)用程序中存儲(chǔ)非ASCII/非Latin-1字符變得容易。此外,在Qt API中廣泛使用QString。QByteArray
適用的兩種主要情況是當(dāng)需要存儲(chǔ)原始二進(jìn)制數(shù)據(jù)時(shí),以及內(nèi)存保護(hù)至關(guān)重要的情況(例如,在Qt for Embedded Linux中)。
初始化QByteArray的一種方法是將const char *傳遞給其構(gòu)造函數(shù)。例如,以下代碼創(chuàng)建一個(gè)包含數(shù)據(jù)"Hello"的大小為5的字節(jié)數(shù)組:
QByteArray ba("Hello");
盡管size()為5,字節(jié)數(shù)組還在末尾保留了一個(gè)額外的’\0’字符,以便在使用需要指向底層數(shù)據(jù)的指針的函數(shù)(例如調(diào)用data())時(shí),所指向的數(shù)據(jù)保證是以’\0’結(jié)尾的。
QByteArray會(huì)對(duì)const char *數(shù)據(jù)進(jìn)行深拷貝,因此您可以稍后進(jìn)行修改而不會(huì)出現(xiàn)副作用。(如果出于性能原因,您不想對(duì)字符數(shù)據(jù)進(jìn)行深拷貝,請(qǐng)改用QByteArray::fromRawData()。)
另一種方法是使用resize()設(shè)置數(shù)組的大小,并逐個(gè)字節(jié)初始化數(shù)據(jù)。QByteArray使用基于0的索引,就像C++數(shù)組一樣。要訪問特定索引位置的字節(jié),可以使用operator。對(duì)于非const字節(jié)數(shù)組,operator返回一個(gè)字節(jié)的引用,可以在賦值的左側(cè)使用。例如:
QByteArray ba;ba.resize(5);ba[0] = 0x3c;ba[1] = 0xb8;ba[2] = 0x64;ba[3] = 0x18;ba[4] = 0xca;
對(duì)于只讀訪問,使用at()的替代語法:
for (int i = 0; i < ba.size(); ++i) {if (ba.at(i) >= 'a' && ba.at(i) <= 'f')cout << "Found character in range [a-f]" << endl;}
at()可能比operator更快,因?yàn)樗肋h(yuǎn)不會(huì)導(dǎo)致深拷貝發(fā)生。
要一次提取多個(gè)字節(jié),請(qǐng)使用left()
、right()
或mid()
。
QByteArray可以嵌入’\0’字節(jié)。size()函數(shù)始終返回整個(gè)數(shù)組的大小,包括嵌入的’\0’字節(jié),但不包括QByteArray添加的終止’\0’。例如:
QByteArray ba1("ca\0r\0t");ba1.size(); // 返回2。ba1.constData(); // 返回帶有終止\0的"ca"。QByteArray ba2("ca\0r\0t", 3);ba2.size(); // 返回3。ba2.constData(); // 返回帶有終止\0的"ca\0"。QByteArray ba3("ca\0r\0t", 4);ba3.size(); // 返回4。ba3.constData(); // 返回帶有終止\0的"ca\0r"。const char cart[] = {'c', 'a', '\0', 'r', '\0', 't'};QByteArray ba4(QByteArray::fromRawData(cart, 6));ba4.size(); // 返回6。ba4.constData(); // 返回不帶終止\0的"ca\0r\0t"。
如果要獲取數(shù)據(jù)長(zhǎng)度,直到但不包括第一個(gè)’\0’字符,可以在字節(jié)數(shù)組上調(diào)用qstrlen()。
在調(diào)用resize()后,新分配的字節(jié)的值是未定義的。要將所有字節(jié)設(shè)置為特定值,請(qǐng)調(diào)用fill()。
要獲取指向?qū)嶋H字符數(shù)據(jù)的指針,請(qǐng)調(diào)用data()或constData()。這些函數(shù)返回指向數(shù)據(jù)開頭的指針。該指針保證在QByteArray上調(diào)用非const函數(shù)之前保持有效。還保證除非QByteArray是從原始數(shù)據(jù)創(chuàng)建的,否則數(shù)據(jù)以’\0’字節(jié)結(jié)尾。QByteArray自動(dòng)提供此’\0’字節(jié),并且不計(jì)入size()中。
QByteArray提供了以下基本函數(shù)來修改字節(jié)數(shù)據(jù):append()、prepend()、insert()、replace()和remove()。例如:
QByteArray x("and");x.prepend("rock "); // x == "rock and"x.append(" roll"); // x == "rock and roll"x.replace(5, 3, "&"); // x == "rock & roll"
replace()
和remove()
函數(shù)的前兩個(gè)參數(shù)是要開始擦除的位置和應(yīng)該擦除的字節(jié)數(shù)。
當(dāng)將數(shù)據(jù)追加到非空數(shù)組時(shí)數(shù)組將被重新分配并將新數(shù)據(jù)復(fù)制到其中。您可以通過調(diào)用reserve()來避免此行為,它預(yù)分配一定數(shù)量的內(nèi)存。您還可以調(diào)用capacity()
來了解QByteArray實(shí)際分配了多少內(nèi)存。追加到空數(shù)組中的數(shù)據(jù)不會(huì)被制。
經(jīng)常要求從字節(jié)數(shù)組中刪除空白字符(‘\n’、‘\t’、''等)。如果要從QByteArray兩端刪除空白字符,請(qǐng)使用trimmed()
。如果要從QByteArray兩端刪除空白字符,并且在字節(jié)數(shù)組中多個(gè)連續(xù)的空白字符替換為單個(gè)空格字符,請(qǐng)使用simplified()。
如果要在QByteArray中查找特定字符或子字符串的所有出現(xiàn),可以使用indexOf()或lastIndexOf()。前者從給定的索引位置向前搜索,后者向后搜索。如果找到了字符或子字符串,兩者都返回其索引位置;否則,它們返回-1。例如,以下是查找特定子字符串的典型循環(huán):
QByteArray ba("We must be <b>bold</b>, very <b>bold</b>");int j = 0;while ((j = ba.indexOf("<b>", j)) != -1) {cout << "Found <b> tag at index position " << j << endl;++j;}
如果只是想檢查一個(gè)QByteArray
是否包含特定字符或子字符串,請(qǐng)使用contains()
。如果想要找出特定字符或子字符串在字節(jié)數(shù)組中出現(xiàn)的次數(shù),請(qǐng)使用count()。如果想要用另一個(gè)值替換所有出現(xiàn)的特定值,請(qǐng)使用帶有兩個(gè)參數(shù)的replace()重載之一。
可以使用諸如operator<(), operator<=(), operator==(), operator>=()等重載運(yùn)算符來比較QByteArray。比較僅基于字符的數(shù)值值,非??焖?#xff0c;但不符合人的預(yù)期。對(duì)于排序用戶界面字符串,QString::localeAwareCompare()是更好的選擇。
由于歷史原因,QByteArray
區(qū)分空字節(jié)數(shù)組和空字節(jié)數(shù)組??兆止?jié)數(shù)組是通過使用QByteArray的默認(rèn)構(gòu)造函數(shù)或通過將(const char *)0傳遞給構(gòu)造函數(shù)進(jìn)行初始化的字節(jié)數(shù)組。大小為0的任何字節(jié)數(shù)組都是空字節(jié)數(shù)組。空字節(jié)數(shù)組不一定是null字節(jié)數(shù)組:
QByteArray().isNull(); // 返回trueQByteArray().isEmpty(); // 返回trueQByteArray("").isNull(); // 返回falseQByteArray("").isEmpty(); // 返回trueQByteArray("abc").isNull(); // 返回falseQByteArray("abc").isEmpty(); // 返回false
除了isNull()函數(shù)外,所有其他函數(shù)都將null字節(jié)數(shù)組視為與空字節(jié)數(shù)組相同。例如,對(duì)于null字節(jié)數(shù)組,data()返回指向 ‘\0’ 字符的指針(非空指針),并且QByteArray()與QByteArray(“”)相等。我們建議始終使用isEmpty(),避免使用isNull()。
QDataStream
:
QDataStream
類提供了將二進(jìn)制數(shù)據(jù)序列化到QIODevice
的功能。
數(shù)據(jù)流是一個(gè)二進(jìn)制編碼信息流,完全獨(dú)立于主機(jī)計(jì)算機(jī)的操作系統(tǒng)、CPU或字節(jié)順序。例如,由Windows PC編寫的數(shù)據(jù)流可以被運(yùn)行Solaris系統(tǒng)的Sun SPARC讀取。
您還可以使用數(shù)據(jù)流來讀寫原始的未編碼的二進(jìn)制數(shù)據(jù)。如果您需要一個(gè)"解析"輸入流,請(qǐng)參見QTextStream
。
QDataStream
類實(shí)現(xiàn)了C++基本數(shù)據(jù)類型(如char、short、int、char *等)的序列化。更雜數(shù)據(jù)的序列化是通過將數(shù)據(jù)分解為基本單元來完成的。
數(shù)據(jù)流與QIODevice緊密配合。QIODevice代表可以從中讀取數(shù)據(jù)或向其寫入數(shù)據(jù)的輸入/輸出介質(zhì)。QFile類是一個(gè)I/O設(shè)備的示例。
示例(將二進(jìn)制數(shù)據(jù)寫入數(shù)據(jù)流):
QFile file("file.dat");file.open(QIODevice::WriteOnly);QDataStream out(&file); // 將數(shù)據(jù)序列化到文件中out << QString("the answer is"); // 序列化字符串out << (qint32)42; // 序列化整數(shù)
示例(從數(shù)據(jù)流讀取二進(jìn)制數(shù)據(jù)):
QFile file("file.dat");file.open(QIODevice::ReadOnly);QDataStream in(&file); // 從文件中讀取已序列化的數(shù)據(jù)QString str;qint32 a;in >> str >> a; // 提取"the answer is"和42
每個(gè)寫入流中的項(xiàng)目都以預(yù)定義的二進(jìn)制格式寫入,該格式取決于項(xiàng)目的類型。支持的Qt類型包括QBrush
、QColor、QDateTime、QFont、QPixmap、QString、QVariant等。有關(guān)支持?jǐn)?shù)據(jù)流的所有Qt類型的完整列表,請(qǐng)參見序列化Qt數(shù)據(jù)類型。
對(duì)于整數(shù),最好始終將其強(qiáng)制轉(zhuǎn)換為Qt整數(shù)類型進(jìn)行寫入,并讀取回到相同的Qt整數(shù)類型中。這樣可以確保您獲得所需的整數(shù)大小,并將您與編譯器和平臺(tái)的差異隔離開來。
舉個(gè)例子,一個(gè)char *字符串被寫為一個(gè)32位整數(shù),該整數(shù)等于字符串長(zhǎng)度,包括’\0’字節(jié),后跟字符串的所有字符,包括’\0’字節(jié)。當(dāng)讀取一個(gè)char *字符串時(shí),首先讀取4個(gè)字節(jié)以創(chuàng)建32位長(zhǎng)度值,然后讀取相同數(shù)量的字符來創(chuàng)建包含’\0’終止符的char *字符串。
初始的I/O設(shè)備通常在構(gòu)造函數(shù)中設(shè)置,但可以使用setDevice()
進(jìn)行更改。如果已到達(dá)數(shù)據(jù)的末尾(或者沒有設(shè)置I/O設(shè)備),atEnd()將返回true。
版本控制
自Qt 1.0以來,QDataStream
的二進(jìn)制格式已發(fā)生了演變,并且可能會(huì)繼續(xù)著Qt的變化而發(fā)展。在輸入或輸出復(fù)雜類型,非常重要的一點(diǎn)是確保在讀取和寫入時(shí)使用相同版本的(version())。如果您需要前向和后向兼容性,您可以在應(yīng)用程序中硬編碼版本號(hào):
stream.setVersion(QDataStream::Qt_4_0);
如果您正在生成一種新的二進(jìn)制數(shù)據(jù)格式,例如您的應(yīng)用程序創(chuàng)建的文檔文件格式,您可以使用QDataStream以便于移植的格式寫入數(shù)據(jù)。通常,您會(huì)寫一個(gè)簡(jiǎn)短的頭部,包含一個(gè)標(biāo)識(shí)字符串和一個(gè)版本號(hào),以便為將來的擴(kuò)展留出空間。例如:
QFile file("file.xxx");file.open(QIODevice::WriteOnly);QDataStream out(&file);// 寫入包含"魔術(shù)數(shù)字"和版本號(hào)的頭部out << (quint32)0xA0B0C0D0;out << (qint32)123;out.setVersion(QDataStream::Qt_4_0);//入數(shù)據(jù)out << lots_of_interest_data;
然后使用以下代碼進(jìn)行讀取:
QFile file("file.xxx");file.open(QIODevice::ReadOnly);QDataStream (&infile);// 讀取并檢查頭部quint32 magic;in >> magic;if (magic != 0xA0B0C0D0)return XXX_BAD_FILE_FORMAT;// 讀取版本號(hào)qint32 version;in >> version;if (version < 100)return XXX_FILE_TOO_OLD;if (version > 123)return XXX_BAD_FILE_TOO_NEW;if (version <= 110)in.setVersion(QDataStream::Qt_3_2);elsein.setVersion(QDataStream::Qt_4_0);// 取數(shù)據(jù)in >> lots_of_interesting_data;if (version >= 120)in >> data_new_in_XXX_version_1_2;in >> other_interesting_data;
在序列化數(shù)據(jù)時(shí),您可以選擇使用哪種字節(jié)順序。默認(rèn)設(shè)置為big endian(最高位在前)。將其更改為little endian會(huì)破壞可移植性(除非讀取方也更改為little endian)。我們建議保持此設(shè)置,除非有特殊需求。
讀取和寫入原始二進(jìn)制數(shù)據(jù)
您可能希望直接從數(shù)據(jù)流中讀取/寫入自己的原始二進(jìn)制數(shù)據(jù)??梢允褂?code>readRawData()將數(shù)據(jù)從流中讀取到預(yù)先分配的char *
中。類似地,可以使用writeRawData()
將數(shù)據(jù)寫入到流中。注意,數(shù)據(jù)的任何編碼/解碼都必須由您自己完成。
另一對(duì)類似的函數(shù)是readBytes()
和writeBytes()
。與原始函數(shù)的不同之處在于:readBytes()讀取一個(gè)quint32,將其視為要讀取的長(zhǎng)度,然后將該數(shù)量的字節(jié)讀入預(yù)先分配的char *中;writeBytes()寫入包含數(shù)據(jù)長(zhǎng)度的quint32,然后是數(shù)據(jù)本身。請(qǐng)注意,數(shù)據(jù)的任何編碼/解碼(除了長(zhǎng)度quint32之外)都必須由您自己完成。
QTextStream
:
QTextStream
類提供了一個(gè)方便的界面,用于讀寫文本。
QTextStream
可以操作QIODevice
、QByteArray
或QString
。使用QTextStream的流操作符,您可以方便地讀寫單詞、行和數(shù)字。對(duì)于生成文本,QTextStream支持字段填充和對(duì)齊的格式選項(xiàng),以及數(shù)字的格式化。示例:
QFile data("output.txt");if (data.open(QFile::WriteOnly | QFile::Truncate)) {QTextStream out(&data);out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;// 輸出 "Result: 3.14 2.7 "}
通常還會(huì)使用QTextStream來讀取控制臺(tái)輸入和寫入控制臺(tái)輸出。QTextStream具有區(qū)域設(shè)置意識(shí),并將自動(dòng)使用正確的編解碼器對(duì)標(biāo)準(zhǔn)輸入進(jìn)行解碼。示例:
QTextStream stream(stdin);QString line;while (stream.readLineInto(&line)) {...}
除了使用QTextStream
的構(gòu)造函數(shù)外,還可以通過調(diào)用setDevice()或setString()設(shè)置QTextStream操作的設(shè)備或字符串。可以通過調(diào)用seek()來定位到某個(gè)位置,當(dāng)沒有數(shù)據(jù)可以讀取時(shí),調(diào)用atEnd()將返回true。如果調(diào)用flush(),QTextStream將會(huì)將其寫緩沖區(qū)中的所有數(shù)據(jù)清空到設(shè)備,并調(diào)用設(shè)備上的flush()。
在內(nèi)部,QTextStream使用基于Unicode的緩沖區(qū),QTextCodec用于自動(dòng)支持不同的字符集。默認(rèn)情況下,讀取和寫入使用QTextCodec::codecForLocale()
,但也可以通過調(diào)用setCodec()來設(shè)置編解碼器。還支持自動(dòng)Unicode檢測(cè)。當(dāng)啟用此功能時(shí)(默認(rèn)行為),QTextStream將檢測(cè)UTF-16或UTF-32的BOM(字節(jié)順序標(biāo)記),并在讀取時(shí)切換到適當(dāng)?shù)腢TF編解碼器。QTextStream默認(rèn)不會(huì)寫入BOM,但可以通過調(diào)用setGenerateByteOrderMark(true)
啟用。當(dāng)QTextStream
直接操作QString
時(shí),編解碼器被禁用。
使用QTextStream
讀取文本文件有三種常見方式:
- 按塊讀取,通過調(diào)用readLine()或readAll()。
- 逐個(gè)單詞讀取。QTextStream支持流式讀取到QString、QByteArray和char*緩沖區(qū)中。單詞由空格分隔,并自動(dòng)跳過前導(dǎo)空格。
- 逐個(gè)字符讀取,通過流式讀取到QChar或char類型中。這種方法通常用于方便地處理輸入,無論字符編碼和行尾的語義如何。要跳過空格,調(diào)用skipWhiteSpace()。\
由于文本流使用緩沖區(qū),您不應(yīng)該使用超類的實(shí)現(xiàn)從流中讀取。例如,如果您有一個(gè)QFile并直接使用QFile::readLine()從中讀取,而不使用流,文本流的內(nèi)部位置將與文件的位置不同步。
默認(rèn)情況下,當(dāng)從文本流中讀取數(shù)字時(shí),QTextStream會(huì)自動(dòng)檢測(cè)數(shù)字的進(jìn)制表示。例如,如果數(shù)字以"0x"開頭,它被認(rèn)為是十六進(jìn)制形式。如果以1-9的數(shù)字開頭,它被認(rèn)為是十進(jìn)制形式,依此類推。您可以通過調(diào)用setIntegerBase()設(shè)置整數(shù)的進(jìn)制,從而禁用自動(dòng)檢測(cè)。示例:
QTextStream in("0x50 0x20");int firstNumber, secondNumber;in >> firstNumber; // firstNumber == 80in >> dec >> secondNumber; // secondNumber == 0char ch;in >> ch; // ch == 'x'
QTextStream支持許多用于生成文本的格式選項(xiàng)。您可以通過調(diào)用setFieldWidth()和setPadChar()設(shè)置字段寬度和填充字符。使用setFieldAlignment()設(shè)置每個(gè)字段內(nèi)的對(duì)齊方式。對(duì)于實(shí)數(shù),可以調(diào)用setRealNumberNotation()和setRealNumberPrecision()設(shè)置所生成數(shù)字的表示(智能表示、科學(xué)表示、定點(diǎn)表示)和精度(數(shù)字位數(shù))。還可以通過setNumberFlags()設(shè)置其他一些數(shù)字格式選項(xiàng)。
與標(biāo)準(zhǔn)C++庫(kù)中的一樣,QTextStream還定義了幾個(gè)全局操縱函數(shù):
操縱函數(shù) | 描述 |
---|---|
bin | 與setIntegerBase(2)相同。 |
oct | 與setIntegerBase(8)相同。 |
dec | 與setIntegerBase(10)相同。 |
hex | 與setIntegerBase(16)相同。 |
showbase | 與setNumberFlags(numberFlags() |
forcesign | 與setNumberFlags(numberFlags() |
forcepoint | 與setNumberFlags(numberFlags() |
noshowbase | 與setNumberFlags(numberFlags() & ~ShowBase)相同。 |
noforcesign | 與setNumberFlags(numberFlags() & ~ForceSign)相同。 |
noforcepoint | 與setNumberFlags(numberFlags() & ~ForcePoint)相同。 |
uppercasebase | 與setNumberFlags(numberFlags() |
uppercasedigits | 與setNumberFlags(numberFlags() |
lowercasebase | 與setNumberFlags(numberFlags() & ~UppercaseBase)相同。 |
lowercasedigits | 與setNumberFlags(numberFlags() & ~UppercaseDigits)相同。 |
fixed | 與setRealNumberNotation(FixedNotation)相同。 |
scientific | 與setRealNumberNotation(ScientificNotation)同。 |
left | 與setFieldAlignment(AlignLeft)相同。 |
right | 與setFieldAlignment(AlignRight)相同。 |
center | 與setFieldAlignment(AlignCenter)相同。 |
endl | 與operator<<(‘\n’)和flush()相同。 |
flush | 與flush()相同。 |
reset | 與reset()相同。 |
ws | 與skipWhiteSpace()相同。 |
bom | 與setGenerateByteOrderMark(true)相同。 |
此外,Qt提供了三個(gè)帶有參數(shù)的全局操縱符:qSetFieldWidth()
、qSetPadChar()
和qSetRealNumberPrecision()
。
總結(jié)就是,QFile
用于文件的讀寫操作,QByteArray
用于處理二進(jìn)制數(shù)據(jù),QDataStream
用于二進(jìn)制數(shù)據(jù)的序列化和反序列化,而QTextStream
用于文本數(shù)據(jù)的讀寫和處理。它們各自有不同的功能和適用場(chǎng)景,根據(jù)具體需求選擇合適的類進(jìn)行操作。
用法及示例
當(dāng)使用Qt中的QFile、QByteArray、QDataStream和QTextStream時(shí),可以按照以下示例來使用它們的成員函數(shù):
QFile
的使用示例:
#include <QFile>
#include <QDebug>
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 創(chuàng)建一個(gè)QFile對(duì)象QFile file("data.txt");// 打開文件以進(jìn)行寫入if (file.open(QIODevice::WriteOnly)){// 寫入數(shù)據(jù)到文件QString data = "Hello, World!";file.write(data.toUtf8());// 關(guān)閉文件file.close();}// 打開文件以進(jìn)行讀取if (file.open(QIODevice::ReadOnly)){// 讀取文件中的數(shù)據(jù)QByteArray data = file.readAll();// 將字節(jié)數(shù)組轉(zhuǎn)換為字符串并輸出QString str(data);qDebug() << str;// 關(guān)閉文件file.close();}return a.exec();
}
QByteArray
的使用示例:
#include <QByteArray>
#include <QDebug>
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 創(chuàng)建一個(gè)QByteArray對(duì)象QByteArray byteArray;// 向字節(jié)數(shù)組添加數(shù)據(jù)byteArray.append("Hello");byteArray.append(" ");byteArray.append("World!");// 輸出字節(jié)數(shù)組中的數(shù)據(jù)qDebug() << byteArray;// 清空字節(jié)數(shù)組byteArray.clear();return a.exec();
}
QDataStream
的使用示例:
#include <QDataStream>
#include <QFile>
#include <QDebug>
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 創(chuàng)建一個(gè)QFile對(duì)象QFile file("data.bin");// 打開文件以進(jìn)行寫入if (file.open(QIODevice::WriteOnly)){// 創(chuàng)建一個(gè)QDataStream對(duì)象,并傳入QFile對(duì)象QDataStream stream(&file);// 寫入整數(shù)到流中int value = 42;stream << value;// 關(guān)閉文件file.close();}// 打開文件以進(jìn)行讀取if (file.open(QIODevice::ReadOnly)){// 創(chuàng)建一個(gè)QDataStream對(duì)象,并傳入QFile對(duì)象QDataStream stream(&file);// 從流中讀取整數(shù)int value;stream >> value;// 輸出取到的整數(shù)qDebug() << value;//閉文件file.close();}return a.exec();
}
QTextStream
的使用示例:
#include <QTextStream>
#include <QFile>
#include <QDebug>
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 創(chuàng)建一個(gè)QFile對(duì)象QFile file("data.txt");// 打開文件以進(jìn)行寫if (file.open(QIODevice::WriteOnly | QIODevice::Text)){// 創(chuàng)建一個(gè)QTextStream對(duì)象,并傳入QFile對(duì)象QTextStream stream(&file);// 寫入文本到流中stream << "Hello, World!";// 關(guān)閉文件file.close();}// 打開文件以進(jìn)行讀取if (file.open(QIODevice::ReadOnly | QIODevice::Text)){// 創(chuàng)建一個(gè)QTextStream對(duì)象,并傳入QFile對(duì)象QTextStream stream(&file);// 從流中讀取文本QString text = stream.readAll();// 輸出讀取到的文本qDebug() << text;// 關(guān)閉文件file.close();}return a.exec();
}
示例分別使用QFile來讀寫文件、使用QByteArray處理字節(jié)數(shù)組、使用QDataStream進(jìn)行二進(jìn)制數(shù)據(jù)的序列化和反序列化、以及使用QTextStream進(jìn)行文本數(shù)據(jù)的讀寫處理。
綜合用法
#include <QFile>
#include <QByteArray>
#include <QDataStream>
#include <QTextStream>
#include <QDebug>
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 創(chuàng)建一個(gè)QByteArray對(duì)象QByteArray byteArray;// 向字節(jié)數(shù)組添加數(shù)據(jù)byteArray.append("Hello, World!");// 創(chuàng)建一個(gè)QFile對(duì)象QFile file("data.bin");// 打開文件以進(jìn)行寫入if (file.open(QIODevice::WriteOnly)){// 創(chuàng)建一個(gè)QDataStream對(duì)象,并傳入QFile對(duì)象QDataStream dataStream(&file);// 將字節(jié)數(shù)組寫入流dataStream << byteArray;// 關(guān)閉文件file.close();}// 打開文件以進(jìn)行讀取if (file.open(QIODevice::ReadOnly)){// 創(chuàng)建一個(gè)QDataStream對(duì)象,并傳入QFile對(duì)象QDataStream dataStream(&file);// 創(chuàng)建一個(gè)新的QByteArray對(duì)象QByteArray newDataArray;// 從流中讀取字節(jié)數(shù)組dataStream >> newDataArray;// 創(chuàng)建一個(gè)QTextStream對(duì)象QTextStream textStream(&newDataArray);// 讀取字符串?dāng)?shù)據(jù)QString text = textStream.readAll();// 輸出讀取到的字符串qDebug() << text;// 關(guān)閉文件file.close();}return a.exec();
}
輸出結(jié)果
示例中,首先創(chuàng)建一個(gè)QByteArray對(duì)象并向它添加數(shù)據(jù)。然后,將這個(gè)字節(jié)數(shù)組寫入到一個(gè)文件中(使用QDataStream),并將文件關(guān)閉。接下來,再次打開文件并使用QDataStream從中讀取字節(jié)數(shù)組。最后,使用QTextStream讀取字節(jié)數(shù)組中的字符串?dāng)?shù)據(jù),并將其輸出到控制臺(tái)。