QTextStream


對 於文字資料的讀取,可以使用QTextStream作為方便的操作介面,它適用於QIODevice的子類別、QByteArray、QString等, 可以使用 << 與 >> 運算子進行資料的讀取與寫入,QTextStream只是對QIODevice、QByteArray、QString的裝飾(Decorator),提 供方便的操作。

下面的程式先示範QTextStream於QFile上的運用,程式可以讓您使用命令列引數指定要讀取的檔案,並顯示在主控台中:
#include <QFile>
#include <QTextSTream>
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
QString src(argv[1]);

QFile file(src);

if (!file.open(QIODevice::ReadOnly)) {
cerr << "Cannot open file for reading:"
<< qPrintable(file.errorString()) << endl;

return false;
}

QTextStream in(&file);

while (!in.atEnd()) {
cout << qPrintable(in.readLine()) << endl;
}

return true;
}
 
程式中用QTextStream包裝QFile,使用QTextStream的atEnd()方法測試是否取檔案結束,使用readLine()讀入資料並包裝為QString實例。

如果想要寫入文字至檔案,可以使用 << 運算子,例如:
#include <QFile>
#include <QTextSTream>
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
QFile file("data.txt");

if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
cerr << "Cannot open file for writing:"
<< qPrintable(file.errorString()) << endl;

return false;
}

QTextStream out(&file);

out << "name\tscore" << endl;
out << "justin\t" << 95 << endl;
out << "momor\t" << 93 << endl;
out << "minnie\t" << 93 << endl;

return true;
}

在開啟檔案時,如果是想要附加文字內容至檔案,記得設定開啟模式為QIODevice::Append。設定開啟模式為QIODevice::Text, 這在讀取文字檔案時,換行字元會置換為'\n',在寫入文字檔案時,換行字元會置換為平台相依字元,例如Windows平台的'\r\n'。

在上面的程式中可以看到,您可以直接使用 << 並搭配C++標準函式庫的 I/O 格式控制器I/O 格式化旗標,例如以下將顯示123456的16進位的數字3039:
out << hex << 12345 << endl;

您也可以直接使用QTextStream的setIntegerBase(16)來設定相同的效果,另外還可以使用setXXXFlags()方法來設置showbase等格式控制,詳細設定方式,可以查詢QTextStream類別的文件說明。

在讀入檔案的時候,可以使用 >> 運算子,不過要注意的是,讀取時以空白為區隔,例如若使用以上的程式寫入檔案,在使用以下的程式片段讀取時,結果str1會是"name",str2會是"score":
QTextStream in(&file);
QString str1, str2;
in >> str1 >> str2;
cout << qPrintable(str1) << endl;
cout << qPrintable(str2) << endl;


之前說過,QTextStream可以使用於QIODevice、QString等之上,例如以下的程式片段中,str結果將儲存"caterpillar.onlyfun":
QString str;
QTextStream in(&str);
in << "caterpillar" << "." << "onlyfun";
cout << qPrintable(str) << endl;

預設上,QTextStream會使用系統的預設編碼作為讀取寫入文字資料時的編碼,您也可以使用setCodec()方法來設置讀取寫入文字時的編碼,例如:
QTextStream stream;
stream.setCodec("UTF-8");