Qt:QTextStream


0、說明

QTextStream提供了讀寫文本文件的接口。

QTextStream可以操作QIODevice,  QByteArray 和 QString,調用QTextStream的流操作可以方便的讀取文字、行、數字等,還提供了文本填充和對齊的相關格式。

例如:

QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
    QTextStream out(&data);
    out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
    // writes "Result: 3.14      2.7       "
}

1)控制台輸入輸出

QTextStream也常用於控制台輸入輸出,它可以自動將標准輸入解碼為正確的格式,例如:

QTextStream stream(stdin);
QString line;
while(stream.readLineInto(&line)){
    ...
}

2)Device、flush與編碼

除了用QTextStream構造器外,也可以通過setDevice() 和 setString()設置QTextStream的Device和String。可以用seek()跳轉到指定位置,如果沒有數據可讀,那么atEnd()會返回true。調用flush()后,QTextStream就會把所有數據從轉移到device中,並且調用device的flush()。

QTextStream在內部使用Unicode編碼,並且使用QTextCodec來支持不同的字符編碼。默認情況下,QTextCodec::codecForLocale()是讀寫時所用的編碼,調用setCodec()設置編碼。

3)讀取文本文件

QTextStream使用三種方式讀取文本文件:

  • 一塊一塊讀,readLine() or readAll();
  • 一個字一個字讀(即一次讀一個字符串):QTextStream支持流入QStrings, QByteArrays 和char *的buffer。字間通過空格分隔。
  • 一個字符一個字符讀:流入QChar或char,通常用於文件解析時。

由於QTextStream使用了buffer,所以我們不能用超類對象從流中讀取。例如,如果我們有一個QFile對象並直接用QFile::readLine()來讀取,而不是通過流,那么TextStream的在文件中位置將會失去同步。

4)格式與數字

默認情況下,當從文本流中讀取數字時,QTextStream將會自動解析它的進制。例如,以"0x"開頭的數字會被解析為十六進制。而以1-9開頭的則會被解析為十進制。我們也可以手動設置進制,從而避免自動檢測,方法是setIntegerBase():

QTextStream in("0x50 0x20");
int firstNumber, secondNumber;

in >> firstNumber;             // firstNumber == 80
in >> dec >> secondNumber;     // secondNumber == 0

char ch;
in >> ch;                      // ch == 'x'

QTextStream支持許多有關構造文本的格式選項:

可以通過setFieldWidth() 和 setPadChar()來設置文本寬度填充字符

使用setFieldAlignment()來設置每段文本的對齊方式;

對於數字,用setRealNumberNotation() 與 setRealNumberPrecision()設置符號精度,一些額外的數字格式項通過setNumberFlags()設置。

 

類似標准C++庫<iostream>,QTextStream也定義了一些全局操作符,這使得我們在使用<<>>時,可以通過這些全局操作符及相關函數進行輸出格式上的一些設置:

比如,我們要用十進制和十六進制輸出兩個值:

QTextStream in("0x50 20");
int firstNumber, secondNumber;

in >> hex >> firstNumber;      // firstNumber == 80
in >> dec >> secondNumber;     // secondNumber == 20

1、模塊和加載項

Header: #include <QTextStream>
qmake: QT += core

2、構造

QTextStream(QByteArray array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)  
QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)  
QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)  
QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)  
QTextStream(QIODevice *device)  
QTextStream()  

 

3、靜態字段

enum FieldAlignment { AlignLeft, AlignRight, AlignCenter, AlignAccountingStyle } 對齊方式
enum NumberFlag { ShowBase, ForcePoint, ForceSign, UppercaseBase, UppercaseDigits } 整數、float、double數字輸出時的顯示格式
flags NumberFlags
enum RealNumberNotation { ScientificNotation, FixedNotation, SmartNotation } float、double表示方法
enum Status { Ok, ReadPastEnd, ReadCorruptData, WriteFailed } 當前文本流的狀態

6、實例方法

返回值類型

方法

說明

bool atEnd() 如果QTextStream中沒有更多數據可讀,返回true
bool autoDetectUnicode() 如果允許自動監測Unicode則返回true
QTextCodec * codec() 編解碼器
QIODevice * device() Device
QTextStream::FieldAlignment fieldAlignment() 對齊方式
int fieldWidth() 文本寬度
void flush() 刷新所有等待寫入Device的buffer中的數據
bool generateByteOrderMark() 當采用UTF編碼器時,如果QTextStream被設置為生成UTC BOM時返回true
int integerBase() 當前進制
QLocale locale()  
QTextStream::NumberFlags numberFlags() number flags
QChar padChar() 填充字符
qint64 pos() 當前位置
QString read(qint64 maxlen) 讀取至多maxlen個字符
QString readAll() 讀取全部
QString readLine(qint64 maxlen = 0) 讀一行,至多maxlen
bool readLineInto(QString *line, qint64 maxlen = 0) 讀一行到line中,至多maxlen
QTextStream::RealNumberNotation realNumberNotation() 數字標識
int realNumberPrecision() 數字精度
void reset() 重置格式選項
void resetStatus() 重置狀態
bool seek(qint64 pos) 跳轉到Pos處
void

setAutoDetectUnicode(bool enabled)

設置是否自動檢測編碼

setCodec(QTextCodec *codec)

setCodec(const char *codecName)

設置編解碼器
setDevice(QIODevice *device) 設置Device
setFieldAlignment(QTextStream::FieldAlignment mode) 對齊方式
setFieldWidth(int width) 文本寬度
setGenerateByteOrderMark(bool generate)  
setIntegerBase(int base) 進制
setLocale(QLocale locale)  
setNumberFlags(QTextStream::NumberFlags flags) number flag
setPadChar(QChar ch) 填充字段
setRealNumberNotation(QTextStream::RealNumberNotation notation) 數字標識
setRealNumberPrecision(int precision) 數字精度
setStatus(QTextStream::Status status) 狀態
setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite) 為string設置當前字符串
void skipWhiteSpace() 跳過開頭的空格字符,之后讀取全部
QTextStream::Status status() 狀態
QString * string() QTextStream的string
QTextStream & operator<<(T t) 寫入t到stream中,T可以是任何常見Qt、C格式
QTextStream & operator>>(T &t) 從stream中讀取一個T存入t中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM