
QProcess、QTcpSocket、QUdpSoctet 和 QSslSocket 是順序訪問設(shè)備,只能從頭到尾讀下去不能回頭。 QFile、QTemporaryFile 和 QBuffer 是隨機(jī)訪問設(shè)備,可以訪問任意位置任意次數(shù),還可以使用 QIODevice::seek() 函數(shù)來重新定位文件訪問位置指針。
#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(); //是否可執(zhí)行 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 區(qū)別可以直接看文檔的例子。
QDataStream 提供了基于 QIODevice 的二進(jìn)制數(shù)據(jù)的序列化。 數(shù)據(jù)流是一種二進(jìn)制流,完全不依賴于底層操作系統(tǒng)、CPU 或者字節(jié)順序(大端或小端)。例如,在安裝了 Windows 平臺的 PC 上面寫入的一個數(shù)據(jù)流,可以不經(jīng)過任何處理,直接拿到運(yùn)行了 Solaris 的 SPARC 機(jī)器上讀取。由于數(shù)據(jù)流就是二進(jìn)制流,因此我們也可以直接讀寫沒有編碼的二進(jìn)制數(shù)據(jù),例如圖像、視頻、音頻等。
QDataStream 既能夠存取 C++ 基本類型,如 int、char、short 等,也可以存取復(fù)雜的數(shù)據(jù)類型,例如自定義的類。實(shí)際上,QDataStream 對于類的存儲,是將復(fù)雜的類分割為很多基本單元實(shí)現(xiàn)的。
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(); }二進(jìn)制流在寫入的時候會在沒個數(shù)據(jù)前面加上這個數(shù)據(jù)的長度。 注意:讀取順序必須和寫入順序一致。畢竟是二進(jìn)制數(shù)據(jù)流,錯一位就改不回來了。 而且可以看到先把文件關(guān)閉了又打開才讀取的數(shù)據(jù),因?yàn)榱鲾?shù)據(jù)在寫入的時候游標(biāo)是跟著向后移動的,游標(biāo)在文件末尾,如果直接讀取顯然是拿不到數(shù)據(jù)的。當(dāng)然也可以用方法:out.device()->seek(0) 將游標(biāo)重新移動到開頭位置。
由于二進(jìn)制流是純粹的字節(jié)數(shù)據(jù),帶來的問題是,如果程序不同版本之間按照不同的方式讀取(前面說過,Qt 保證讀寫內(nèi)容的一致,但是并不能保證不同 Qt 版本之間的一致),數(shù)據(jù)就會出現(xiàn)錯誤。因此,我們必須提供一種機(jī)制來確保不同版本之間的一致性。
QFile file("file.dat");file.open(QIODevice::WriteOnly);QDataStream out(&file);// 寫入魔術(shù)數(shù)字和版本out << (quint32)0xA0B0C0D0;out << (qint32)123;out.setVersion(QDataStream::Qt_4_0);// 寫入數(shù)據(jù)out << lots_of_interesting_data;這樣一來,在讀取文件的時候,先判斷魔術(shù)數(shù)字以及版本的一致性,即可保證。
QTextStream 的寫入和QDataStream并無二致。但讀取則不樣。因?yàn)榇嫒〉氖俏谋緮?shù)據(jù),并不像二進(jìn)制流一樣會存上每個數(shù)據(jù)的長度。 將上面的例子改成文本流,就會發(fā)現(xiàn) 輸出時 str == the answer is 42. 而 a 并沒有重新賦值。 文本流 可以設(shè)置編碼格式 stream.setCodec("UTF-8"); 另外:另外,為方便起見,QTextStream 同 std::cout 一樣提供了很多描述符,被稱為 stream manipulators。因?yàn)槲谋疚募枪┤巳プx的,自然需要良好的格式(相比而言,二進(jìn)制文件就沒有這些問題,只要數(shù)據(jù)準(zhǔn)確就可以了)。這些描述符是一些函數(shù)的簡寫,我們可以從文檔中找到:
Qt 容器
QList:這是至今為止提供的最通用的容器類。它將給定的類型 T 的對象以列表的形式進(jìn)行存儲,與一個整型的索引關(guān)聯(lián)。QList 在內(nèi)部使用數(shù)組實(shí)現(xiàn),同時提供基于索引的快速訪問。我們可以使用 QList::append() 和 QList::prepend() 在列表尾部或頭部添加元素,也可以使用 QList::insert() 在中間插入。相比其它容器類,QList 專門為這種修改操作作了優(yōu)化。QStringList 繼承自 QList。
QLinkedList:類似于 QList,除了它是使用遍歷器進(jìn)行遍歷,而不是基于整數(shù)索引的隨機(jī)訪問。對于在中部插入大量數(shù)據(jù),它的性能要優(yōu)于 QList。同時具有更好的遍歷器語義(只要數(shù)據(jù)元素存在,QLinkedList 的遍歷器就會指向一個合法元素,相比而言,當(dāng)插入或刪除數(shù)據(jù)時,QList 的遍歷器就會指向一個非法值)。
QVector< T>:用于在內(nèi)存的連續(xù)區(qū)存儲一系列給定類型的值。在頭部或中間插入數(shù)據(jù)可能會非常慢,因?yàn)檫@會引起大量數(shù)據(jù)在內(nèi)存中的移動。
QStack< T>:這是 QVector 的子類,提供了后進(jìn)先出(LIFO)語義。相比 QVector,它提供了額外的函數(shù):push(),pop() 和 top()。
QQueue< T>:這是 QList 的子類,提供了先進(jìn)先出(FIFO)語義。相比 QList,它提供了額外的函數(shù):enqueue(),dequeue() 和 head()。
QSet< T>:提供單值的數(shù)學(xué)上面的集合,具有快速的查找性能。
QMap< Key, T>:提供了字典數(shù)據(jù)結(jié)構(gòu)(關(guān)聯(lián)數(shù)組),將類型 T 的值同類型 Key 的鍵關(guān)聯(lián)起來。通常,每個鍵與一個值關(guān)聯(lián)。QMap 以鍵的順序存儲數(shù)據(jù);如果順序無關(guān),QHash 提供了更好的性能。
QMultiMap< Key, T>:這是 QMap 的子類,提供了多值映射:一個鍵可以與多個值關(guān)聯(lián)。
QHash< Key, T>:該類同 QMap 的接口幾乎相同,但是提供了更快的查找。QHash 以字母順序存儲數(shù)據(jù)。
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() 也是可以的。
新聞熱點(diǎn)
疑難解答