首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 學習之路(57):文本文件讀寫——QTextStream 編碼與格式化完全指南

     編輯:關於C語言

文本流 vs 二進制流

  • QDataStream:二進制,攜帶類型/長度信息,不可直接人類閱讀,適合程序間高效交換。
  • QTextStream:文本,人類可讀,自動處理 Unicode ↔ 本地編碼、換行符轉換(Windows \r\n / Unix \n),基於 16 位 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。

格式化輸出控制符(Stream Manipulators)

類似 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 / ForceSignout << forcesign << 123 → "+123"
大寫十六進制uppercasedigits / UppercaseDigitsout << 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"

Setter 風格示例


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";

XML/HTML 特殊處理

雖可用 QTextStream 手工生成,但強烈建議使用 QXmlStreamWriter / QDomDocument,自動處理轉義、結構驗證。

總結

  1. 文本文件用 QFile + QTextStream,指定 setCodec("UTF-8")。
  2. 寫入簡單,讀取首選逐行/全文 + 字符串解析,避免 operator>> 粘連陷阱。
  3. 善用格式化控制符生成對齊、定寬、特定進制報表。
  4. 輸出目標可為 QString、QByteArray,便於內存中構建文本。

本文出自 “豆子空間” 博客,原文地址:https://devbean.blog.51cto.com/448512/297145

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved