文件读写
来源:互联网 发布:数据分析师培训课程 编辑:程序博客网 时间:2024/06/15 22:59
文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图:
QIODevice
:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;QFlie
:访问本地文件或者嵌入资源;QTemporaryFile
:创建和访问本地文件系统的临时文件;QBuffer
:读写QByteArray
;QProcess
:运行外部程序,处理进程间通讯;QAbstractSocket
:所有套接字类的父类;QTcpSocket:TCP
协议网络数据传输;QUdpSocket
:传输 UDP 报文;QSslSocket
:使用 SSL/TLS 传输数据;QFileDevice:Qt5
新增加的类,提供了有关文件操作的通用实现。
这其中,QProcess
、QTcpSocket
、QUdpSoctet
和QSslSocket
是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个节;QFile
、QTemporaryFile
和QBuffer
是随机访问设备,可以访问任意位置任意次数,还可以使用QIODevice::seek()
函数来重新定位文件访问位置指针。
在所有的 I/O 设备中,文件 I/O 是最重要的部分之一。因为我们大多数的程序依旧需要首先访问本地文件(当然,在云计算大行其道的将来,这一观点可能改变)。QFile
提供了从文件中读取和写入数据的能力。Qt5 新加入的QFileDevice
类,则将这部分公共操作放到了这个单独的类中。显然,这部分代码在 Qt4 中位于QFile
类。这样看来,Qt5 的代码结构更为清晰,层次更好。
我们通常会将文件路径作为参数传给QFile
的构造函数。不过也可以在创建好对象最后,使用setFileName()
来修改。QFile
需要使用 / 作为文件分隔符,不过,它会自动将其转换成操作系统所需要的形式。例如 C:/windows 这样的路径在 Windows 平台下同样是可以的。
QFile
主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStream或QTextStream类来读写文件,也可以使用QIODevice
类提供的read()
、readLine()
、readAll()
以及write()
这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo
获取,而不是自己分析文件路径字符串。
下面我们使用一段代码来看看QFile
的有关操作:
#include "wenjian.h"#include <QApplication>#include <QFile>#include <QFileInfo>#include <QIODevice>#include <QTextCodec>#include <QDebug>#include <QStringList>#include <QString>int main(int argc, char *argv[]){ QApplication a(argc, argv); QFile file("C:\\Users\\Eric\\Desktop\\1.txt"); //使用open()函数打开这个文件,打开形式是只读方式,文本格式 if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){ qDebug() << "Open file failed."; return -1; }else{ QTextStream stream(&file); QStringList lines; QString line; stream.setCodec( QTextCodec::codecForName("GB2312"));//中文转码 while(!stream.atEnd()){ // 一行一行读取,不包括“/n”的一行文本,也可以用readAll()全部读取 //QTextStream 也可以直接把内容输出到 QString line = stream.readLine(); qDebug()<< line; //输出到“应用程序输出”窗口。 lines += line; } } /* * QFileInfo 有很多类型的函数。比如这里, isDir()检查该文件是否是目录;isExecutable()检查 * 该文件是否是可执行文件等。 baseName()可以直接获得文件名; suffix()则直接获取文件后缀名。 */ QFileInfo info(file); qDebug() << info.isDir(); qDebug() << info.isExecutable(); qDebug() << info.baseName(); qDebug() << info.completeBaseName(); qDebug() << info.suffix(); qDebug() << info.completeSuffix(); file.close(); QStringList lines2; lines2.append("123"); lines2.append("456"); lines2.append("呵呵"); QFile file2( "D:\\1.txt" ); if ( file2.open( QIODevice::WriteOnly ) ) {//只写模式 QTextStream stream2(&file2); for (auto it = lines2.begin(); it != lines2.end(); ++it ) stream2 << *it << "\r\n"; file2.close(); } return a.exec();}枚举值 描述
QIODevice::NotOpen 未打开
QIODevice::ReadOnly 以只读方式打开
QIODevice::WriteOnly 以只写方式打开
QIODevice::ReadWrite 以读写方式打开
QIODevice::Append 以追加的方式打开,新增加的内容将被追加到文件末尾
QIODevice::Truncate 以重写的方式打开,在写入新的数据时会将游标设置在文件开头
QIODevice::Text 在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n
QIODevice::Unbuffered 忽略缓存