
QProcess、QTcpSocket、QUdpSoctet 和 QSslSocket 是順序訪問設備,只能從頭到尾讀下去不能回頭。 QFile、QTemporaryFile 和 QBuffer 是隨機訪問設備,可以訪問任意位置任意次數,還可以使用 QIODevice::seek() 函數來重新定位文件訪問位置指針。
#include <Qapplication>#include <QDebug>#include <QFile>#include <QFileInfo>int main(int argc, char *argv[]){ QApplication app(argc, argv); QFile file("C:/Users/Aaron/Documents/LenovoHdReport.txt"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Open file failed."; return -1; } else { while (!file.atEnd()) { qDebug() << file.readLine(); //一次讀一行 } } QFileInfo info(file); qDebug() << info.path(); //返回路徑 qDebug() << info.isDir(); //是否是路徑 qDebug() << info.isExecutable(); //是否可執行 qDebug() << info.baseName(); //Returns the base name of the file without the path. qDebug() << info.completeBaseName();//Returns the complete base name of the file without the path. qDebug() << info.suffix(); //Returns the suffix of the file. qDebug() << info.completeSuffix();//Returns the complete suffix of the file. return app.exec();}complateSuffix , suffix 區別可以直接看文檔的例子。
QDataStream 提供了基于 QIODevice 的二進制數據的序列化。 數據流是一種二進制流,完全不依賴于底層操作系統、CPU 或者字節順序(大端或小端)。例如,在安裝了 Windows 平臺的 PC 上面寫入的一個數據流,可以不經過任何處理,直接拿到運行了 Solaris 的 SPARC 機器上讀取。由于數據流就是二進制流,因此我們也可以直接讀寫沒有編碼的二進制數據,例如圖像、視頻、音頻等。
QDataStream 既能夠存取 C++ 基本類型,如 int、char、short 等,也可以存取復雜的數據類型,例如自定義的類。實際上,QDataStream 對于類的存儲,是將復雜的類分割為很多基本單元實現的。
QFile file("file.dat"); if(file.open(QIODevice::WriteOnly|QIODevice::ReadOnly)){ QDataStream out(&file); //寫入 out << QString("the answer is"); out << (qint32)42; file.close(); }else{ return -1; } if(file.open(QIODevice::ReadOnly)){ QDataStream in(&file); //讀取 QString str; qint32 a = 3; in>>str>>a; qDebug()<<str<<a; file.close(); }二進制流在寫入的時候會在沒個數據前面加上這個數據的長度。 注意:讀取順序必須和寫入順序一致。畢竟是二進制數據流,錯一位就改不回來了。 而且可以看到先把文件關閉了又打開才讀取的數據,因為流數據在寫入的時候游標是跟著向后移動的,游標在文件末尾,如果直接讀取顯然是拿不到數據的。當然也可以用方法:out.device()->seek(0) 將游標重新移動到開頭位置。
由于二進制流是純粹的字節數據,帶來的問題是,如果程序不同版本之間按照不同的方式讀取(前面說過,Qt 保證讀寫內容的一致,但是并不能保證不同 Qt 版本之間的一致),數據就會出現錯誤。因此,我們必須提供一種機制來確保不同版本之間的一致性。
QFile file("file.dat");file.open(QIODevice::WriteOnly);QDataStream out(&file);// 寫入魔術數字和版本out << (quint32)0xA0B0C0D0;out << (qint32)123;out.setVersion(QDataStream::Qt_4_0);// 寫入數據out << lots_of_interesting_data;這樣一來,在讀取文件的時候,先判斷魔術數字以及版本的一致性,即可保證。
QTextStream 的寫入和QDataStream并無二致。但讀取則不樣。因為存取的是文本數據,并不像二進制流一樣會存上每個數據的長度。 將上面的例子改成文本流,就會發現 輸出時 str == the answer is 42. 而 a 并沒有重新賦值。 文本流 可以設置編碼格式  stream.setCodec("UTF-8"); 另外:另外,為方便起見,QTextStream 同 std::cout 一樣提供了很多描述符,被稱為 stream manipulators。因為文本文件是供人去讀的,自然需要良好的格式(相比而言,二進制文件就沒有這些問題,只要數據準確就可以了)。這些描述符是一些函數的簡寫,我們可以從文檔中找到:
Qt 容器
QList:這是至今為止提供的最通用的容器類。它將給定的類型 T 的對象以列表的形式進行存儲,與一個整型的索引關聯。QList 在內部使用數組實現,同時提供基于索引的快速訪問。我們可以使用 QList::append() 和 QList::prepend() 在列表尾部或頭部添加元素,也可以使用 QList::insert() 在中間插入。相比其它容器類,QList 專門為這種修改操作作了優化。QStringList 繼承自 QList。
QLinkedList:類似于 QList,除了它是使用遍歷器進行遍歷,而不是基于整數索引的隨機訪問。對于在中部插入大量數據,它的性能要優于 QList。同時具有更好的遍歷器語義(只要數據元素存在,QLinkedList 的遍歷器就會指向一個合法元素,相比而言,當插入或刪除數據時,QList 的遍歷器就會指向一個非法值)。
QVector< T>:用于在內存的連續區存儲一系列給定類型的值。在頭部或中間插入數據可能會非常慢,因為這會引起大量數據在內存中的移動。
QStack< T>:這是 QVector 的子類,提供了后進先出(LIFO)語義。相比 QVector,它提供了額外的函數:push(),pop() 和 top()。
QQueue< T>:這是 QList 的子類,提供了先進先出(FIFO)語義。相比 QList,它提供了額外的函數:enqueue(),dequeue() 和 head()。
QSet< T>:提供單值的數學上面的集合,具有快速的查找性能。
QMap< Key, T>:提供了字典數據結構(關聯數組),將類型 T 的值同類型 Key 的鍵關聯起來。通常,每個鍵與一個值關聯。QMap 以鍵的順序存儲數據;如果順序無關,QHash 提供了更好的性能。
QMultiMap< Key, T>:這是 QMap 的子類,提供了多值映射:一個鍵可以與多個值關聯。
QHash< Key, T>:該類同 QMap 的接口幾乎相同,但是提供了更快的查找。QHash 以字母順序存儲數據。
QMultiHash< Key, T>:這是 QHash 的子類,提供了多值散列。
遍歷器: QListIterator< T> 只讀遍歷器; QMutableListIterator< T> 讀寫遍歷器。其他的容器都一樣。
兩種容器的遍歷方式
QMutableListIterator<int> i(list);while (i.hasNext()) { if (i.next() > 128) { i.setValue(128); //也可以直接 i = 128; }}QList<QString> list;list << "A" << "B" << "C" << "D";QList<QString>::iterator i;for (i = list.begin(); i != list.end(); ++i) { *i = (*i).toLower();}另外 foreach() 也是可以的。
| 
 
 | 
新聞熱點
疑難解答