Qt中使用流讀寫檔案
二進位制檔案的讀寫:
QDataStream 提供了基於 QIODevice 的二進位制資料的序列化。資料流是一種二進 制流,這種流完全不依賴於底層作業系統、CPU 或者位元組順序(大端或小端)。由於資料流就是二進位制 流,因此我們也可以直接讀寫沒有編碼的二進位制資料,例如影象、視訊、音訊等。 QDataStream 既能夠存取 C++ 基本型別,如 int、char、short 等,也可以存 取複雜的資料型別,例如自定義的類。實際上,QDataStream 對於類的儲存,是 將複雜的類分割為很多基本單元實現的。
1,寫二進位制檔案:
QString path = QFileDialog::getSaveFileName(this,"open","./","source(*.cpp)");
if(path.isEmpty() == false){
QFile file(path);
if(file.open(QIODevice::WriteOnly) == true)
{
/*常見資料流和file檔案關聯
* 往資料流輸入資料=往檔案裡面寫資料
*/
QDataStream stream (&file);
stream << QString("測試") << 250;
file.close();
}
}
注:建立資料量物件的時候繫結輸入輸出驅動後,向資料流裡面寫資料,相當於往驅動繫結的檔案裡面寫資料。和標準C++裡面的輸入輸出流一樣,<<
表示資料的流向。
2,讀二進位制檔案
QString path = QFileDialog::getOpenFileName(this,"open","./", "source(*.cpp)");
if(path.isEmpty() == false){
QFile file(path);
if(file.open(QIODevice::ReadOnly) == true)
{
/*常見資料流和file檔案關聯
* 往資料流輸出資料=檔案讀資料
*/
QDataStream stream(&file);
/*讀的時候按寫的順序取資料*/
QString str ;
int a ;
stream >> str >> a;
/*轉成char*型別的資料輸出*/
cout <<str.toUtf8().data();
cout <<a;
file.close();
}
}
注:讀的時候要注意資料寫入順序。
對於cout我們使用巨集定義如下:
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ <<"]"
這樣在輸出的時候就可以輸出檔名和行號,便於除錯。
文字檔案的讀寫:
二進位制檔案比較小巧,卻不是人可讀 的格式。而文字檔案是一種人可讀的檔案。為了操作這種檔案,我們需要使用 QTextStream
類。QTextStream
和 QDataStream
的使用類似,只不過它是操作純 文字檔案的。 QTextStream
會自動將 Unicode
編碼同作業系統的編碼進行轉換,這一操作對 開發人員是透明的。它也會將換行符進行轉換,同樣不需要自己處理。
1,寫文字檔案:
QString path = QFileDialog::getSaveFileName(this,"Save","./","source(*.cpp)");
if(path.isEmpty() == false)
{
QFile file(path);
if(file.open(QIODevice::WriteOnly) == true)
{
QTextStream textStream(&file);
/*指定編碼*/
textStream.setCodec("UTF-8");
textStream << QString("你好,世界!") << 1000;
file.close();
}
}
注:關於QTextStream
只是比QDataStream
多了一個可以指定編碼,其餘方法相同。
2,寫文字檔案:
QString path = QFileDialog::getOpenFileName(this,"Save","./","source(*.cpp)");
if(path.isEmpty() == false)
{
QFile file(path);
if(file.open(QIODevice::ReadOnly) == true)
{
QTextStream textStream(&file);
/*指定編碼*/
textStream.setCodec("UTF-8");
/*
預設全部為字串
QString str;
int a;
textStream >> str >> a;
cout << str.toUtf8().data() << a;
*/
QString str;
str = textStream.readAll();
cout << str;
file.close();
}
}
注:在讀檔案的時候一般指定的編碼和寫檔案的時候相同,防止出現亂碼,字在讀的時候和QDataStream
不同的是,它預設全部為字串,如果按照順序讀取的時候,後面的整型變數為0,因為把整型數預設也為字元,所以讀的時候一般採用和QFile相同的方式讀
1,如上,全部直接讀寫
QString str;
str = textStream.readAll();
cout << str;
2,也可以採用一個迴圈一行一行讀取
while(textStream.atEnd() == false)
{
str += textStream.readLine();
}
使用QBuffer配合二進位制資料流讀寫檔案
1,普通QBuffer讀寫檔案:
/*定義位元組陣列和QBuffer物件*/
QByteArray array;
QBuffer memFile(&array,this);
/*開啟*/
memFile.open(QIODevice::WriteOnly);
/*寫入資料*/
memFile.write("111111111111111111111");
memFile.write("22222222222222222222222");
/*關閉,並且寫入*/
memFile.close();
qDebug() << memFile.buffer();
qDebug() << "array="<< array;
注意:每次在緩衝寫入資料之後必須要關閉之後才能正常寫入。
2,配合二進位制流讀寫資料:
寫入資料(QString
型別和整型):
QBuffer memFile(this);
memFile.open(QIODevice::WriteOnly);
QDataStream stream(&memFile);
stream << QString("測試") <<250;
memFile.close();
讀資料:
memFile.open(QIODevice::ReadOnly);
QDataStream stream1(&memFile);
QString str;
int a;
stream1 >> str >> a;
qDebug() << str.toUtf8().data() << a;
注意:讀資料的時候不能使用如下方法:
qDebug() << QString(memFile.buffer()).toUtf8().data();
經過多次型別轉換之後無法正常讀出資料。