QT輸入輸出(一) 之 QDataStream 測試


QT提供了兩個高級別的流類---QDataStream和QTextStream,可以從任意的輸入輸出設備讀取或寫入數據。

QDataStream用於讀寫二進制數據,它的優點是:在讀寫數據的時候已經嚴格定義了數據流的類型和每個類型的長度,這樣就不用關心編碼之間轉換的問題了。

QTextStream用於讀寫文本(如HTML、XML和源代碼等)的格式,解決了二進制文件格式無法直接閱讀和編輯的缺點。QTextStream考慮了Unicode編碼與系統本地編碼或其他編碼之間的轉換問題,並考慮了不同操作系統之間行尾符切換的問題(MS “\r\n”, Mac “ \n”)。

QTextStream使用16位的QChar類型作為基本數據單元,並支持數字類型和字符串類型的轉換。



現在先對QDataStream測試:


(一)先看測試代碼

#include <QCoreApplication>
#include<QDataStream>
#include<QFile>
#include<QHash>
#include<iostream>
#include<QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QHash<int, QString> hash;
hash.insert(0, "working");
hash.insert(1, "hard");
hash.insert(2, "!");
QString str("this is a QDataStream test ");
QFile file("test.dat");
if(!file.open(QIODevice::WriteOnly))
{
std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl;
// return;
}
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_3);
out<<quint32(0x12345678)<<str<<hash;

if(!file.flush())
{
qDebug("write faile");
}


QFile file_in("test.dat");
if(!file_in.open(QIODevice::ReadOnly))
{
std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl;

}
QDataStream in(&file_in);
in.setVersion(QDataStream::Qt_4_3);
quint32 c;
QHash<int, QString> b;
QString str1;
in>> c >> str1 >> b;
qDebug()<<c <<endl<<str1<<endl;
QHash<int, QString>::const_iterator j;
for(j = b.constBegin(); j != b.constEnd(); j++)
qDebug()<<j.key()<<" "<<j.value()<<endl;


return a.exec();
}

(二)測試結果


(三)總結

1、

std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl;
才用標准錯誤輸出,qPrintable()函數將QString轉換為C++標准的 const char* 字符串。
也可采用QString.toStdString(),返回C++ string類型。
2、
由於QT中不同版本有不同的QT數據類型的表示方式,所以在輸入輸出時最好設置統一的版本號(版本號是一個整數),保持存儲、接收數據的一致性。
 
out.setVersion(QDataStream::Qt_4_3);
in.setVersion(QDataStream::Qt_4_3);
3、
QDataStream默認采用大端(big-endian)方式存儲32位整數,所以為了在所有平台上確保0x12345678表示的都是32位無符號數,采用了quint的強制類型轉換
 
quint32(0x12345678)

4、


 
if(!file.flush()){    qDebug("write faile");}
在《C++ GUI QT 4》中,沒有加入這一句,所以會出現數據無法寫入文件的問題,當然也無法讀到數據。是因為,寫操作是把數據寫到緩沖區,交給操作系統完成寫到文件的任務,但是操作系統是多任務的,不會立即把緩沖區的數據寫到文件,所以最好強制把緩沖區的數據寫到文件。
 
 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com