鍍金池/ 教程/ C/ 文本文件讀寫
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學習之路(18): Qt 標準對話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學習之路(tip): parent 參數(shù)
Qt 標準對話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標準對話框之 QFileDialog
自定義 model 之二
深入了解信號槽
坐標變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個對話框(下)
Qt 學習之路(32): 一個簡易畫板的實現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺的程序
MainWindow
初探信號槽
Qt 學習之路(17): Qt 標準對話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲容器
進程間交互
API 文檔的使用
創(chuàng)建一個對話框(上)
一個簡易畫板的實現(xiàn)(QWidget)

文本文件讀寫

二進制文件比較小巧,但是不是人可讀的格式。文本文件是一種人可讀的格式的文件,為了操作這種文件,我們需要使用 QTextStream 類。QTextStream 和 QDataStream的使用類似,只不過它是操作純文本文件的。還有一些文本格式,比如 XML、HTML,雖然可以由 QTextStream 生成,但 Qt 提供了更方便的 XML 操作類,這里就不包括這部分內(nèi)容了。

QTextStream 會自動將 Unicode 編碼同操作系統(tǒng)的編碼進行轉(zhuǎn)換,這一操作對程序員是透明的。它也會將換行符進行轉(zhuǎn)換,同樣不需要你自己去處理。QTextStream 使用16位的 QChar 作為基礎(chǔ)的數(shù)據(jù)存儲單位,同樣,它也支持 C++標準類型,如 int 等。實際上,這是將這種標準類型與字符串進行了相互轉(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"; 

是我們寫入的代碼。我們分別寫入兩個單詞,然后試圖以與二進制文件讀出的格式相同的形式讀出:


in >> str1 >> str2; 

上面兩段代碼的 out 和 in 都是 QTextStream 類型的。雖然我們可以正常寫入,但讀出的時候,str1里面將是 DenmarkNorway,str2 是空的。以文本形式寫入數(shù)據(jù),是不能區(qū)分數(shù)據(jù)的截斷位置的。因為使用 QDataStream 寫入的時候,實際上是要在字符串前面寫如長度信息的。因此,對于文本文件,更多的是一種全局性質(zhì)的操作,比如使用 QTextStream::readLine() 讀取一行,使用 QTextStream::readAll() 讀取所有文本,之后再對獲得的 QString 對象進行處理。 默認情況下,QTextStream 使用操作系統(tǒng)的本地編碼進行讀寫。不過你可以使用 setCodec() 函數(shù)進行設(shè)置,比如


stream.setCodec("UTF-8"); 

類似,QTextStream 也提供了一些用于格式化輸出的描述符,稱為 stream manipulators。這些描述符放置在輸出內(nèi)容之前,或者是使用相應(yīng)的函數(shù),用于對后面的輸出內(nèi)容做格式化。具體的描述符如下

setIntegerBase(int)
0 讀出時自動檢測數(shù)字前綴
2 二進制
8 八進制
10 十進制
16 十六進制
setNumberFlags(NumberFlags)
ShowBase 顯示前綴,二進制顯示0b,八進制顯示0,十六進制顯示0x
ForceSign 在實數(shù)前面顯示符號
ForcePoint 在數(shù)字中顯示點分隔符
UppercaseBase 使用大寫的前綴,如0B, 0X
UppercaseDigits 使用大寫字母做十六進制數(shù)字
setRealNumberNotation(RealNumberNotation)
FixedNotation 定點計數(shù)表示,如0.000123
ScientificNotation 科學計數(shù)法表示,如1.23e-4
SmartNotation 定點或科學計數(shù)法表示,自動選擇簡潔的一種表示法
setRealNumberPrecision(int)
設(shè)置生成的最大的小數(shù)位數(shù),默認是6
setFieldWidth(int)
設(shè)置一個字段的最小值,默認是0
setFieldAlignment(FieldAlignment)
AlignLeft 左對齊
AlignRight 右對齊
AlignCenter 中間對齊
AlignAccountingStyle 符號和數(shù)字之間對齊
setPadChar(QChar)
設(shè)置對齊時填充的字符,默認是空格

比如,下面的代碼


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

上一篇:坐標變換下一篇:QString