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中 |