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 #include2 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。