1. 程式人生 > 其它 >Qt中使用流讀寫檔案

Qt中使用流讀寫檔案

技術標籤:Qt學習c++qt5

二進位制檔案的讀寫:

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 類。QTextStreamQDataStream 的使用類似,只不過它是操作純 文字檔案的。 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();

經過多次型別轉換之後無法正常讀出資料。