Qt文件系統之QFile


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()可以獲得文件中的當前位置。 QFileQBuffer是隨機訪問設備的示例。
順序設備不支持尋找任意位置。必須一次讀取數據。函數pos()和size()不適用於順序設備。 QTcpSocketQProcess是順序設備的

 

QIODevice的某些子類(例如QTcpSocketQProcess)是異步的。這意味着諸如write()或read()之類的I / O函數總是立即返回,而當控制返回到事件循環時,可能會發生與設備本身的通信。 QIODevice提供的功能允許您強制立即執行這些操作,同時阻止調用線程並且不進入事件循環。這允許在沒有事件循環的情況下使用QIODevice子類,或者在單獨的線程中使用:
waitForReadyRead() - 此函數暫停調用線程中的操作,直到有新數據可供讀取。
waitForBytesWritten() - 此函數暫停調用線程中的操作,直到已將一個數據有效負載寫入設備。
waitFor ....() - QIODevice的子類為特定於設備的操作實現阻塞功能。例如,QProcess有一個名為waitForStarted()的函數,它暫停調用線程中的操作,直到進程啟動。
從主GUI線程調用這些函數可能會導致用戶界面凍結。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM