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。