W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
二進(jìn)制文件比較小巧,但是不是人可讀的格式。文本文件是一種人可讀的格式的文件,為了操作這種文件,我們需要使用 QTextStream 類。QTextStream 和 QDataStream的使用類似,只不過它是操作純文本文件的。還有一些文本格式,比如 XML、HTML,雖然可以由 QTextStream 生成,但 Qt 提供了更方便的 XML 操作類,這里就不包括這部分內(nèi)容了。
QTextStream 會自動將 Unicode 編碼同操作系統(tǒng)的編碼進(jìn)行轉(zhuǎn)換,這一操作對程序員是透明的。它也會將換行符進(jìn)行轉(zhuǎn)換,同樣不需要你自己去處理。QTextStream 使用16位的 QChar 作為基礎(chǔ)的數(shù)據(jù)存儲單位,同樣,它也支持 C++標(biāo)準(zhǔn)類型,如 int 等。實(shí)際上,這是將這種標(biāo)準(zhǔn)類型與字符串進(jìn)行了相互轉(zhuǎn)換。
QTextStream 同 QDataStream 使用基本一致,例如下面的代碼將把“Thomas M. Disch: 334/n”寫入到 tmp.txt 文件中:
QFile file("sf-book.txt");
if (!file.open(QIODevice::WriteOnly)) {
std::cerr << "Cannot open file for writing: "
<< qPrintable(file.errorString()) << std::endl;
return;
}
QTextStream out(&file);
out << "Thomas M. Disch: " << 334 << endl;
可以看到,這段代碼同前面的 QDataStream 相關(guān)代碼基本雷同。文本文件的寫入比較容易,但是讀出就不那么簡單了。例如,
out << "Denmark" << "Norway";
是我們寫入的代碼。我們分別寫入兩個單詞,然后試圖以與二進(jìn)制文件讀出的格式相同的形式讀出:
in >> str1 >> str2;
上面兩段代碼的 out 和 in 都是 QTextStream 類型的。雖然我們可以正常寫入,但讀出的時候,str1里面將是 DenmarkNorway,str2 是空的。以文本形式寫入數(shù)據(jù),是不能區(qū)分?jǐn)?shù)據(jù)的截斷位置的。因為使用 QDataStream 寫入的時候,實(shí)際上是要在字符串前面寫如長度信息的。因此,對于文本文件,更多的是一種全局性質(zhì)的操作,比如使用 QTextStream::readLine() 讀取一行,使用 QTextStream::readAll() 讀取所有文本,之后再對獲得的 QString 對象進(jìn)行處理。默認(rèn)情況下,QTextStream 使用操作系統(tǒng)的本地編碼進(jìn)行讀寫。不過你可以使用 setCodec() 函數(shù)進(jìn)行設(shè)置,比如
stream.setCodec("UTF-8");
同 類似,QTextStream 也提供了一些用于格式化輸出的描述符,稱為 stream manipulators。這些描述符放置在輸出內(nèi)容之前,或者是使用相應(yīng)的函數(shù),用于對后面的輸出內(nèi)容做格式化。具體的描述符如下
setIntegerBase(int) | |
---|---|
0 | 讀出時自動檢測數(shù)字前綴 |
2 | 二進(jìn)制 |
8 | 八進(jìn)制 |
10 | 十進(jìn)制 |
16 | 十六進(jìn)制 |
setNumberFlags(NumberFlags) | |
---|---|
ShowBase | 顯示前綴,二進(jìn)制顯示0b,八進(jìn)制顯示0,十六進(jìn)制顯示0x |
ForceSign | 在實(shí)數(shù)前面顯示符號 |
ForcePoint | 在數(shù)字中顯示點(diǎn)分隔符 |
UppercaseBase | 使用大寫的前綴,如0B, 0X |
UppercaseDigits | 使用大寫字母做十六進(jìn)制數(shù)字 |
setRealNumberNotation(RealNumberNotation) | |
---|---|
FixedNotation | 定點(diǎn)計數(shù)表示,如0.000123 |
ScientificNotation | 科學(xué)計數(shù)法表示,如1.23e-4 |
SmartNotation | 定點(diǎn)或科學(xué)計數(shù)法表示,自動選擇簡潔的一種表示法 |
setRealNumberPrecision(int) |
---|
設(shè)置生成的最大的小數(shù)位數(shù),默認(rèn)是6 |
setFieldWidth(int) |
---|
設(shè)置一個字段的最小值,默認(rèn)是0 |
setFieldAlignment(FieldAlignment) | |
---|---|
AlignLeft | 左對齊 |
AlignRight | 右對齊 |
AlignCenter | 中間對齊 |
AlignAccountingStyle | 符號和數(shù)字之間對齊 |
setPadChar(QChar) |
---|
設(shè)置對齊時填充的字符,默認(rèn)是空格 |
比如,下面的代碼
out << showbase << uppercasedigits << hex << 12345678;
將輸出0xBC614E。或者我們可以這樣去寫:
out.setNumberFlags(QTextStream::ShowBase | QTextStream::UppercaseDigits);
out.setIntegerBase(16);
out << 12345678;
QTextStream 不僅僅可以輸出到 QIODevice 上,也可以輸出到 QString 上面,例如
QString str;
QTextStream(&str) << oct << 31 << " " << dec << 25 << endl;
本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: