天天看點

Qt中QFile、QByteArray QDataStream和QTextStream差別

Qt系列文章目錄

文章目錄

  • ​​Qt系列文章目錄​​
  • ​​前言​​
  • ​​一、QFile​​
  • ​​二、QByteArray​​
  • ​​三、QDataStream​​
  • ​​四、QTextStream​​

前言

在Qt中讀寫檔案我們常常會用到QFile、QByteArray、QDataStream和QTextStream,他們之間有什麼差別呢?

一、QFile

檔案打開方式:

QIODevice::NotOpen 0x0000 裝置不打開.

QIODevice::ReadOnly 0x0001 裝置 以隻讀的方式打開.

QIODevice::WriteOnly 0x0002 裝置 以隻寫的方式打開.

QIODevice::ReadWrite ReadOnly | WriteOnly 裝置以讀寫的方式打開,寫入檔案會覆寫之前的内容(打開檔案期間多次寫入不會覆寫).

QIODevice::Append 0x0004 裝置以追加模式打開,以便将所有資料寫入檔案末尾,此模式下不能讀檔案.

QIODevice::Truncate 0x0008 如果可能,裝置在打開之前會被截斷。 裝置的所有早期内容都将丢失。

QIODevice::Text 0x0010 讀取時,行尾終止符被轉換為’\ n’。 寫入時,行尾終止符将轉換為本地編碼,例如Win32的“\ r \ n”。

QIODevice::Unbuffered 0x0020 繞過裝置中的任何緩沖區。

注意:

普通寫入會覆寫之前檔案的内容部分或者全部,取決于寫入内容的大小。

當同時使用Append方式和其它讀檔案方式打開檔案時,讀檔案無效。

//清空檔案内容并重寫資料
void clearFileRewriteData(const QString &clearFileName, const QString &contentSource)
{
    QStringList fileContentLst;
    //讀取資料來源檔案
    QFile sourceFile(contentSource);
    if(sourceFile.open(QIODevice::ReadOnly))
    {
        while(!sourceFile.atEnd())
        {
            QString line = sourceFile.readLine();
            fileContentLst << line;
        }
    }

    QFile cartFile(clearFileName);
//    cartFile.open(QFile::ReadWrite | QFile::Truncate);
    cartFile.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate);
    //寫入cart檔案内容
    QTextStream writeStream(&cartFile);
    QString writeContent = writeStream.readAll();
    writeStream.setAutoDetectUnicode(true);
    foreach(auto line, fileContentLst)
    {
//        writeStream << line;
        writeStream << line << endl;  //因為檔案中已包含"\r\n",是以這裡不用加endl
    }
    cartFile.close();
//    sourceFile.flush();
    sourceFile.close();
}      
Qt中QFile、QByteArray QDataStream和QTextStream差別

二、QByteArray

QByteArray類提供了一個位元組數組。

QByteArray可用于存儲原始位元組(包括’\ 0’)和傳統的8位’\ 0’終止字元串。使用QByteArray比使用const char *更友善。在幕後,它始終確定資料後跟’\ 0’終止符,并使用隐式共享(寫時複制)來減少記憶體使用并避免不必要的資料複制。

QByteArray 是位元組數組,可用于存儲原始位元組(包括 ‘\0’)和傳統的 8 位以 ‘\0’ 結尾的字元串。使用 QByteArray 比使用 const char * 友善得多。在幕後,它始終確定資料後跟一個“\0”終止符,并使用隐式共享(copy-on-write)來減少記憶體使用并避免不必要的資料複制。

除了 QByteArray,Qt 還提供了 QString 類來存儲字元串資料。對于大多數用途,QString 是理想的字元串類。它将其内容了解為 Unicode 文本(使用 UTF-16 編碼),QString 在 Qt API 中貫穿始終。QByteArray 沒有經過編碼,儲存的是原始的資料。

//大端格式,高位元組在前

QDataStream out(&outData,QIODevice::ReadWrite);

out.setByteOrder(QDataStream::BigEndian);

//小端格式,低位元組在前

QDataStream out(&outData,QIODevice::ReadWrite);

out.setByteOrder(QDataStream::LittleEndian);

QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt");
    if(file.open( QIODevice::ReadWrite | QIODevice::Append ) )// QIODevice::Text |
    {
        QByteArray arr;
        arr =  file.read();
        qDebug() << arr;
        file.write("hello qfile!\n");
    }      

三、QDataStream

QDataStream 類為QIODevice提供序列化的二進制資料。

一個data stream 是一個編碼後的二進制流,它與作業系統等無關。

你可以使用一個data stream去讀寫原始未編碼的二進制資料。如果你想得到一個“parsing”的輸入流,請查閱QTextStream

QDatastream類實作了對c++中基本資料類型的序列化工作,如:char、short、int、char*等。對于複雜的資料類型的序列化,是通過将其分解為基本原生的資料單元來進行。

data stream 跟 QIODevice緊密聯系,一個QIODevice作為輸入輸出的媒介,它可以從寫讀出寫入的資料。QFile就是一個I/O裝置的例子。

void rewriteCartFile(const QString& filePath, const cartContext& context)
{
    QFile fileModify(filePath);
    if(!fileModify.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
    {
        qDebug() << "cart.par file open failed!";
        return;
    }
    QDataStream dataStream(&fileModify);
    QVector<int> numVec;
    for(int i=0; i<100; i++)
    {
        numVec.push_back(i);
    }
    for(auto n : mumVec)
    {
        dataStream << n << "      "  
    }

    fileModify.close();
}      
Qt中QFile、QByteArray QDataStream和QTextStream差別

四、QTextStream

void generateCartFile(const QString& filePath)
{
    QFile cartFile(filePath);
    if(!cartFile.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        qDebug() << "Open cart.part file failed!";
        return;
    }
    QStringList fileContent;
    QTextStream readWrite(&cartFile);
    QString line = readWrite.readLine();
    fileContent << line;
   cartFile.close();

}      

繼續閱讀