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方式和其它讀文件方式打開文件時,讀文件無效。
例如如下代碼:
QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt"); if(file.open( QIODevice::ReadWrite | QIODevice::Append ) )// QIODevice::Text | { QByteArray arr; arr = file.read(6); qDebug() << arr; file.write("hello qfile!\n"); }
"hello qfile!\n"會被追加到文件里,arr輸出為空。
QByteArray類
QByteArray類提供了一個字節數組。
QByteArray可用於存儲原始字節(包括'\ 0')和傳統的8位'\ 0'終止字符串。使用QByteArray比使用const char *更方便。在幕后,它始終確保數據后跟'\ 0'終止符,並使用隱式共享(寫時復制)來減少內存使用並避免不必要的數據復制。
寫文件
qint64 QIODevice::write ( const char * data, qint64 maxSize ) //將最多maxSize字節的數據從數據寫入設備。 返回實際寫入的字節數,如果發生錯誤,則返回-1。
qint64 QIODevice::write ( const char * data ) //將數據從零字節的8位字符串寫入設備。 返回實際寫入的字節數,如果發生錯誤,則返回-1。
qint64 QIODevice::write ( const QByteArray & byteArray ) //將byteArray的內容寫入設備。 返回實際寫入的字節數,如果發生錯誤,則返回-1。
QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt"); if(file.open( QIODevice::WriteOnly )) { const char* data = "hello qfile!\n"; QByteArray arr(data); file.write(data); file.write(arr); file.write(data,5); }
文件中被寫入如下內容:
hello qfile!
hello qfile!
hello
讀文件
read()函數
qint64 QIODevice::read ( char * data, qint64 maxSize )//
從設備讀取最多maxSize字節為數據,並返回讀取的字節數。 如果發生錯誤,例如嘗試從以WriteOnly模式打開的設備讀取時,此函數返回-1。當沒有更多數據可供讀取時,返回0。在關閉的套接字上讀取或在進程死亡后讀取也會返回-1
QByteArray QIODevice::read ( qint64 maxSize ) //從設備讀取最多maxSize字節,並返回讀取為QByteArray的數據。
此功能無法報告錯誤; 返回一個空的QByteArray()可能意味着當前沒有數據可用於讀取,或者發生了錯誤。
QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt"); if (file.open(QFile::ReadOnly)) { //QByteArray arr = file.read(1024); //qDebug() << arr; char buf[1024]; qint64 lineLength = file.read(buf, sizeof(buf)); if (lineLength != -1) { QString str(buf);//將字符數組轉換為QString qDebug() << str; } }
打印結果:
"hello qfile!
hello qfile!
hello"
readAll()函數
QByteArray QIODevice::readAll ()
從設備讀取所有可用數據,並將其作為QByteArray返回。
此功能無法報告錯誤; 返回一個空的QByteArray()可能意味着當前沒有數據可用於讀取,或者發生了錯誤。
QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt"); if (file.open(QFile::ReadOnly)) { QByteArray arr = file.readAll(); qDebug() << arr; }
打印結果:
"hello qfile!
hello qfile!
hello"
readData()函數
qint64 QIODevice::readData ( char * data, qint64 maxSize ) [pure virtual protected]
將從設備讀取的maxSize字節讀取到數據中,並返回讀取的字節數,發生錯誤時返回-1。 如果沒有要讀取的字節,如果永遠不會有更多可用字節,則此函數應返回-1(例如:socket closed,pipe closed,sub-process finished)。
該功能由QIODevice調用。 在創建QIODevice的子類時重新實現此功能。
readLine()函數
qint64 QIODevice::readLine ( char * data, qint64 maxSize )
此函數從設備讀取一行ASCII字符,最大為(maxSize - 1)個字節,將字符存儲在數據中,並返回讀取的字節數。 如果無法讀取行但沒有出現錯誤,則此函數返回0.如果發生錯誤,則此函數返回可讀取的長度,如果未讀取任何內容,則返回-1。
終止'\ 0'字節始終附加到數據,因此maxSize必須大於1。
讀取數據,直到滿足以下任一條件:
讀取第一個'\ n'字符。
maxSize - 讀取1個字節。
檢測到設備數據的結束。
此函數調用readLineData(),readLineData()是使用對getChar()的重復調用實現的。 您可以通過在自己的子類中重新實現readLineData()來提供更高效的實現。
QFile file("/home/cheng/TestPro/D_FileOperation/File/test.txt"); if (file.open(QFile::ReadOnly)) { char buf[1024]; qint64 lineLength = file.readLine(buf, sizeof(buf)); if (lineLength != -1) { QString str(buf); qDebug() << str; } }
打印結果:
"hello qfile!
"
可以看出"\n"也被附加到了數據里。
getChar()函數
bool QIODevice::getChar ( char * c )
從設備中讀取一個字符並將其存儲在c中。 如果c為0,則丟棄該字符。 成功時返回true; 否則返回false。
QIODevice類
QIODevice類是Qt中所有I / O設備的基本接口類。
QIODevice為支持讀取和寫入數據塊的設備提供了通用實現和抽象接口,例如QFile,QBuffer和QTcpSocket。 QIODevice是抽象的,無法實例化,但通常使用它定義的接口來提供與設備無關的I / O功能。 例如,Qt的XML類在QIODevice指針上運行,允許它們與各種設備(例如文件和緩沖區)一起使用。
在訪問設備之前,必須調用open()來設置正確的OpenMode(例如ReadOnly或ReadWrite)。 然后,您可以使用write()或putChar()寫入設備,並通過調用read(),readLine()或readAll()來讀取。 完成設備后,請調用close()。
QIODevice區分兩種類型的設備:隨機訪問設備和順序設備。
隨機訪問設備支持使用seek()尋找任意位置。通過調用pos()可以獲得文件中的當前位置。 QFile和QBuffer是隨機訪問設備的示例。
順序設備不支持尋找任意位置。必須一次讀取數據。函數pos()和size()不適用於順序設備。 QTcpSocket和QProcess是順序設備的
QIODevice的某些子類(例如QTcpSocket和QProcess)是異步的。這意味着諸如write()或read()之類的I / O函數總是立即返回,而當控制返回到事件循環時,可能會發生與設備本身的通信。 QIODevice提供的功能允許您強制立即執行這些操作,同時阻止調用線程並且不進入事件循環。這允許在沒有事件循環的情況下使用QIODevice子類,或者在單獨的線程中使用:
waitForReadyRead() - 此函數暫停調用線程中的操作,直到有新數據可供讀取。
waitForBytesWritten() - 此函數暫停調用線程中的操作,直到已將一個數據有效負載寫入設備。
waitFor ....() - QIODevice的子類為特定於設備的操作實現阻塞功能。例如,QProcess有一個名為waitForStarted()的函數,它暫停調用線程中的操作,直到進程啟動。
從主GUI線程調用這些函數可能會導致用戶界面凍結。
