Qt的QFile類詳解


QFile 類是操作文件的輸入輸出設備類。QFile是一個用來讀寫二進制文件與文本文件的輸入輸出設備。QFile可以被自己或更方便的類 DataStream或QTextStream使用。文件的名字通常通過構造傳遞,但可以通過setName()來修改。你可以使用exists()來檢 查文件是否存在,並且通過remove()來移除一個文件。文件通過open()被打開,通過close()來關閉,通過flush()來更新。數據通常 使。QDataStream或QTextStream來被讀出寫入,但你可以通過readBlock()和readLine()讀出,通過 writeBlock()寫入。QFile還支持getch(),ungetch(),putch()。文件的大小可以通過size()返回。你可以通過 使用at()函數來獲得文件當前位置或移動到一個新的文件位置。這里有一個代碼片段,它使用QTextStream一行一行讀一個文本文件。它以一個新的 行號打印每一行。
   

 

 1 QStringList lines;
2     QFile file(“file.txt”);
3     if ( file.open(IO_ReadOnly))
4     {
5         QTextStream stream( &file );
6         QString line;
7         int i = 1
8         while ( !stream . eof() )
9         {
10             line = stream . readLine();
11             printf( "%3d:%s\n",i++,line.latin1());
12             lines += line;
13         }
14         file . close();
15     }


 
        

寫文本一樣容易。下面的例子顯示了如何寫入我們在上例中讀到字符串列表里的數據:
    

QFile file("file.txt");
    if (file . open(IO_WriteOnly))
    {
        QTextStream stream(&file);
        for (QStringList :: Iterator it = lines.begin(); it != lines.end();++it)
            stream << *it << "\n";
        file . close();
    }

 
        

QT 使用Unicode作為文件名字。如果你想在Unix系統上使用你自己的輸入與輸出,你應該使用encodeName和decodeName()萊轉換文件名字到你本地的編碼。

常用方法介紹:

1、QFile::QFile()

構造一個沒有名字的QFile對象

2、QFile::QFile(const QString &name)

構造一個以name為文件名的QFile對象。
注:也可以QFile::QFile(),然后調用setName()方法來實現類似動作。

3、boot QFile::atEnd() const [虛函數]

如果已經到達文件末尾則返回TRUE,否則返回FALSE;

4、void QFile::close() [虛函數]

關閉一個打開的文件。
如果文件被一個存在的文件句柄打開,則不能夠關閉。如果存在的文件句柄是一個FILE *,文件會被刷新。如果存在的文件句柄是一個int型的文件描述符,對這個文件什么事情都不會做。

5、QString QFile::decodeName(const QCString & localFileName) [靜態函數]

這是一個使用localFileName與QFile::encodeName()相反的操作。

6、QCString QFile::encodeName(const QString & fileName) [靜態函數]

當 你使用QFile、QFileInfo與QDir來訪問Qt的文件系統的時候,你可以使用Unicode的文件名字。在Unix系統上,這些文件名稱被轉 換成為一個8位編碼的格式。如果你想在Unix上實現你自己的輸入/輸出文件,你需要使用這個函數來轉換文件名稱。在window NT/2000上,文件系統直接支持Unicode命名的文件,這個汗水就可以不適用了。在windows 95 上,這些事不支持的。默認的,這個函數轉換文件名稱到8為本地編碼格式取決於用戶的工作場合。這給用戶給文件命名提供了豐富的選擇空間。在應用程序中位文 件名字硬編碼應該只選用7位ASCII碼為文件名稱字符。轉換方案可以通過使用setEncodingFunction()來改變。如果你希望給使用者一 個可以使用UTF-8編碼命名存儲文件的權利,那這個應該是很有用的,但是要知道這樣一個文件名當其它程序使用時可能就不認識了。

7、bool QFile::exists(const QString &fileName) [靜態函數]

如果給定fileName名的文件存在則返回TRUE,否則返回FALSE。
注:另一個重載函數為boot QFile::exists() const,如果setName()設定的文件存在則返回TRUE,否則返回FALSE。

8、void QFile::flush() [虛函數]

將存放在緩沖區中的文件刷新輸出到磁盤上。
注:close()也會將文件寫入磁盤,並清除文件緩沖區。

9、int QFile::getch() [虛函數]

從一個文件中讀一個字節/字符。
返回讀取的字節/字符。如果到達文件的尾部則返回-1.

10、int QFile::handle () const

返回文件的句柄。
這是一個短整型,與C庫函數例如fopen()與fcntl()的使用類似,以及與QSocketNotifier類似。
如果文件沒有打開或有錯誤,handle()返回-1.

11、QString QFile::name() const

返回被setName()設置的名字。

12、Bool QFile::open(int m) [虛函數]

13、bool QFile::open(int m,FILE *f)

這是一個為了方便而提供的重載成員函數。它在本質表現上類似於上面的函數。它使用一個存在的文件句柄並以參數m模式打開它。如果成功它返回TRUE,否則返回FALSE。
例子:
   

 

1  #include <stdio.h>
2
3     void printError(const char * msg)
4     {
5         QFile f;
6         f.open(IO_WriteOnly,stderr);
7         f.writeBlock(msg,qstrlen(msg));//向stderr中寫入
8         f.close();
9     }



 
        

當QFile使用這個功能打開一個文件時,close()實質上不能關閉文件,只有flushes它了。

警告:如果f是stdin,stdout,stderr,你不能seek定位。

14、bool QFile::open(int m,int f)

  這是一個為了方便而提供的重載成員函數。它本質表現上類似於上述函數。它使用一個已經存在的文件描述符,以模式m打開這個文件。如果成功返回TRUE,否則返回FALSE。當QFile使用這個功能打開一個文件時,close()實質上不能關閉文件。

使用這個函數打開的QFile文件,會自動的被設置成不帶緩沖區的模式,這意味着文件輸入與輸出操作會慢。如果你達到發布執行的時候,你應該試着使用其它的打開函數。

警告:如果f是0(stdin),1(stdout),2(stderr),你不能seek定位。Size()被設置成INT_MAX(in limits.h)

15、int QFile::putch (int ch) [虛函數]

像文件當中寫入字符ch。
返回ch,或如果發生錯誤返回-1

16、QByteArry QIODevice::readAll() [虛函數]

這個方便的函數返回所有在設備上剩余數據。

17、Q_LONG QFile::readLine (char *p,Q_ULONG maxlen ) [虛函數]

讀取去文本中的一行數據。

從文件中讀取的數據存放到以字符指針p開始位置處,直到一行結束或達到maxlen長度字節處無論哪個先發生都會返回。返回讀到字節的長度數值,或發生錯誤后返回-1。返回內容包含終止換行符。

這個函數只有在文件存放在緩沖區中才有效率。避免在使用IO_Raw標志打開文件后使用readLine()操作文件。

18、Q_LONG OFile::readLine(QString &s,Q_ULONG maxlen)

這是為了方便操作而提供的一個重載成員函數。它實質上的功能與上面的函數類似。

從一個文件中讀一行數據。

從文件中讀出多個字節存放到字符串s中,直到一行結束或達到maxlen長度字節處無論哪個先發生都會返回。返回讀到字節的長度數值,或發生錯誤后返回-1。返回內容包含終止換行符。

這個函數只有在文件存放在緩沖區中才有效率。避免在使用IO_Raw標志打開文件后使用readLine()操作文件。

注意:這個字符串以plain Latin1模式讀出來的,不是Unicode。

19、bool QFile::remove()

根據當前設置的文件名刪除文件。如果成功返回TRUE,否則返回FALSE。
在移除文件前這個文件要被關閉掉。

20、bool QFile::remove(const QString & fileName) [靜態函數]

這是一個很有用的可重載成員函數。它本質上的功能類似於上面的函數。它移除指定名稱的文件。如果成功返回TRUE,否則返回FALSE。

21、void QFile::setDecodingFunction(DecoderFn f) [靜態函數]

警號:這個函數是不可重入函數。
Sets the function for decoding 8-bit file names to f. The default uses the locale-specific 8-bit encoding.

22、void QFile::setEncodingFunction(EncoderFn f) [靜態函數]

Sets the function for encoding Unicode file names to f. The default encodes in the locale-specific 8-bit encoding.

23、void QFile::setName(const QString & name)

設置文件對象的名字為name。這個名字可以不包含路徑或相對路徑或絕對路徑。如果文件已經被打開,那么不要調用這個函數。如果文件名不包含路徑或相對路徑,那么無論什么時候在執行open()調用時應用程序當前目錄就會被使用。
示例:
  

  

1 QFile file;
2     QDir::setCurrent("/tmp");
3     file . setName("readme.txt");
4     QDir::setCurrent("/home");
5     file . open(IO_ReadOnly); //打開文件的位置"/home/readme.txt"


24、Offset QFile::size() const [虛函數]

返回文件大小。

25、int QFile::ungetch (int ch) [虛函數]

輸出字符ch返回到文件中,並且如果不為零則減少數值。

這個函數通常在撤銷getch()操作的時候調用。

返回ch,或當錯誤發生的時候返回-1。


免責聲明!

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



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