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();
}
二、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();
}
四、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();
}