QChar。
QFile file("sf-book.txt");
if (!file.open(QIODevice::WriteOnly)) { /* 錯誤處理 */ return; }
QTextStream out(&file);
out << "Thomas M. Disch: " << 334 << Qt::endl; // endl 寫入換行並刷新
// 寫入
out << "Denmark" << "Norway"; // 文件實際內容:DenmarkNorway
// 讀取
QString s1, s2;
in >> s1 >> s2; // s1 = "DenmarkNorway", s2 = ""
原因:文本流不記錄字段長度,operator>> 按空白分隔,無空白則讀成一整個 token。
readLine() → QString,再用 split()/正則解析。readAll() → QString,後處理。QTextStream::operator>> 僅適用於有明確分隔符(空白、換行、制表符)的場景。
QTextStream stream(&file);
stream.setCodec("UTF-8"); // 或 "GBK", "UTF-16" 等
// Qt 5+ 也支持:stream.setEncoding(QStringConverter::Utf8);
默認使用系統本地編碼(QTextStream::codecForLocale())。跨平台文件交換強制指定 UTF-8。
類似 iomanip,可鏈式調用或調用 setter:
| 功能 | 控制符 / Setter | 示例 |
|---|---|---|
| 整數進制 | bin/oct/dec/hex / setIntegerBase(2/8/10/16) | out << hex << 255 → "ff" |
| 顯示前綴 | showbase / setNumberFlags(ShowBase) | out << showbase << hex << 255 → "0xff" |
| 強制符號 | forcesign / ForceSign | out << forcesign << 123 → "+123" |
| 大寫十六進制 | uppercasedigits / UppercaseDigits | out << uppercasedigits << hex << 255 → "FF" |
| 浮點格式 | fixed/scientific/smart / setRealNumberNotation() | out << fixed << 1.234 → "1.234000" |
| 小數位數 | setRealNumberPrecision(6) | 默認 6 位 |
| 字段寬度 | setFieldWidth(10) | 不足填充 |
| 對齊方式 | left/right/center / setFieldAlignment() | out << setFieldWidth(10) << left << "Hi" |
| 填充字符 | setPadChar('0') | out << setPadChar('0') << setFieldWidth(5) << 42 → "00042" |
out << showbase << uppercasedigits << hex << 12345678; // 輸出 "0xBC614E"
out.setNumberFlags(QTextStream::ShowBase | QTextStream::UppercaseDigits);
out.setIntegerBase(16);
out << 12345678; // 同上
// 輸出到 QString
QString str;
QTextStream(&str) << oct << 31 << " " << dec << 25 << Qt::endl;
// str == "37 25\n"
// 輸出到 QByteArray (需配合 QBuffer)
QByteArray ba;
QBuffer buf(&ba);
buf.open(QIODevice::WriteOnly);
QTextStream(&buf) << "Hello";
雖可用 QTextStream 手工生成,但強烈建議使用 QXmlStreamWriter / QDomDocument,自動處理轉義、結構驗證。
QFile + QTextStream,指定 setCodec("UTF-8")。operator>> 粘連陷阱。QString、QByteArray,便於內存中構建文本。本文出自 “豆子空間” 博客,原文地址:https://devbean.blog.51cto.com/448512/297145