程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Qt學習之路(57): 文本文件讀寫

Qt學習之路(57): 文本文件讀寫

編輯:關於C語言

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

QTextStream會自動將 Unicode 編碼同操作系統的編碼進行轉換,這一操作對程序員是透明的。它也會將換行符進行轉換,同樣不需要你自己去處理。QTextStream使用16位的QChar作為基礎的數據存儲單位,同樣,它也支持C++標准類型,如int等。實際上,這是將這種標准類型與字符串進行了相互轉換。

QTextStream同QDataStream使用基本一致,例如下面的代碼將把“Thomas M. Disch: 334/n”寫入到 tmp.txt 文件中:

  1. QFile file("sf-book.txt");  
  2. if (!file.open(QIODevice::WriteOnly)) {  
  3.     std::cerr << "Cannot open file for writing: " 
  4.               << qPrintable(file.errorString()) << std::endl;  
  5.     return;  
  6. }  
  7.  
  8. QTextStream out(&file);  
  9. out << "Thomas M. Disch: " << 334 << endl; 

可以看到,這段代碼同前面的 QDataStream 相關代碼基本雷同。文本文件的寫入比較容易,但是讀出就不那麼簡單了。例如,

  1. out << "Denmark" << "Norway"; 

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

  1. in >> str1 >> str2; 

上面兩段代碼的 out 和 in 都是 QTextStream 類型的。雖然我們可以正常寫入,但讀出的時候,str1裡面將是 DenmarkNorway,str2 是空的。以文本形式寫入數據,是不能區分數據的截斷位置的。因為使用 QDataStream寫入的時候,實際上是要在字符串前面寫如長度信息的。因此,對於文本文件,更多的是一種全局性質的操作,比如使用 QTextStream::readLine() 讀取一行,使用 QTextStream::readAll() 讀取所有文本,之後再對獲得的QString對象進行處理。

默認情況下,QTextStream 使用操作系統的本地編碼進行讀寫。不過你可以使用 setCodec() 函數進行設置,比如

  1. stream.setCodec("UTF-8"); 

同 <iostream> 類似,QTextStream 也提供了一些用於格式化輸出的描述符,稱為stream manipulators。這些描述符放置在輸出內容之前,或者是使用相應的函數,用於對後面的輸出內容做格式化。具體的描述符如下

setIntegerBase(int) 0 讀出時自動檢測數字前綴 2 二進制 8 八進制 10 十進制 16 十六進制

setNumberFlags(NumberFlags) ShowBase 顯示前綴,二進制顯示0b,八進制顯示0,十六進制顯示0x ForceSign 在實數前面顯示符號 ForcePoint 在數字中顯示點分隔符 UppercaseBase 使用大寫的前綴,如0B, 0X UppercaseDigits 使用大寫字母做十六進制數字

setRealNumberNotation(RealNumberNotation) FixedNotation 定點計數表示,如0.000123 ScientificNotation 科學計數法表示,如1.23e-4 SmartNotation 定點或科學計數法表示,自動選擇簡潔的一種表示法

setRealNumberPrecision(int) 設置生成的最大的小數位數,默認是6

setFieldWidth(int) 設置一個字段的最小值,默認是0

setFieldAlignment(FieldAlignment) AlignLeft 左對齊 AlignRight 右對齊 AlignCenter 中間對齊 AlignAccountingStyle 符號和數字之間對齊

setPadChar(QChar) 設置對齊時填充的字符,默認是空格

比如,下面的代碼

  1. out << showbase << uppercasedigits << hex << 12345678; 

將輸出0xBC614E。或者我們可以這樣去寫:

  1. out.setNumberFlags(QTextStream::ShowBase | QTextStream::UppercaseDigits);  
  2. out.setIntegerBase(16);  
  3. out << 12345678; 

QTextStream 不僅僅可以輸出到 QIODevice 上,也可以輸出到 QString 上面,例如

  1. QString str;  
  2. QTextStream(&str) << oct << 31 << " " << dec << 25 << endl; 

本文出自 “豆子空間” 博客,請務必保留此出處http://devbean.blog.51cto.com/448512/297145

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved