文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。
Qt5 新增加了一个QFileDevice类。途中所涉及的类及其用途简要说明如下:
· QFlie:访问本地文件或者嵌入资源;
· QTemporaryFile:创建和访问本地文件系统的临时文件;
· QBuffer:读写QByteArray;
· QProcess:运行外部程序,处理进程间通讯;
· QTcpSocket:TCP协议网络数据传输;
· QUdpSocket:传输 UDP 报文;
· QSslSocket:使用 SSL/TLS 传输数据;
· QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节;QFile、QTemporaryFile和QBuffer是随机访问设备,可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针。
QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStream或QTextStream类来读写文件,也可以使用QIODevice提供的read()、readLine()、readAll()以及write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取,而不是自己分析文件路径字符串。
下面我们使用一段代码来看看QFile的有关操作:
点击(此处)折叠或打开
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
-
- QFile file("in.txt");
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- qDebug() << "Open file failed.";
- return -1;
- } else {
- while (!file.atEnd()) {
- qDebug() << file.readLine();
- }
- }
-
- QFileInfo info(file);
- qDebug() << info.isDir();
- qDebug() << info.isExecutable();
- qDebug() << info.baseName();
- qDebug() << info.completeBaseName();
- qDebug() << info.suffix();
- qDebug() << info.completeSuffix();
-
- return app.exec();
- }
二进制文件读写
Qt 还供了更高一级的操作:用于二进制的流QDataStream和用于文本流的QTextStream。
QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。QDataStream可以很方便地对文件、网络套接字等进行读写操作。我们从代码开始看起:我们从代码开始看起:
点击(此处)折叠或打开
- QFile file("file.dat");
- file.open(QIODevice::WriteOnly);
- QDataStream out(&file);
- out << QString("the answer is");
- out << (qint32)42;
- file.close();// 如果不想关闭文件,可以使用 file.flush();
下面,我们要将这个数据读取出来:
点击(此处)折叠或打开
- file.open(QIODevice::ReadOnly);
- QDataStream in(&file);
- QString str;
- qint32 a;
- in >> str >> a;
这段代码没什么好说的。唯一需要注意的是,你必须按照写入的顺序,将数据读取出来。
文本文件读写
QTextStream和QDataStream的使用类似,只不过它是操作纯文本文件的。
例如下面的代码将把“The answer is 42”写入到 file.txt 文件中:
点击(此处)折叠或打开
- QFile data("file.txt");
- if (data.open(QFile::WriteOnly | QIODevice::Truncate)) {
- QTextStream out(&data);
- out << "The answer is " << 42;
- }
这里,我们在open()函数中增加了QIODevice::Truncate打开方式。我们可以从下表中看到这些打开方式的区别:
枚举值 | 描述 |
QIODevice::NotOpen | 未打开 |
QIODevice::ReadOnly | 以只读方式打开 |
QIODevice::WriteOnly | 以只写方式打开 |
QIODevice::ReadWrite | 以读写方式打开 |
QIODevice::Append | 以追加的方式打开,新增加的内容将被追加到文件末尾 |
QIODevice::Truncate | 以重写的方式打开,在写入新的数据时会将游标设置在文件开头 |
QIODevice::Text | 在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n |
QIODevice::Unbuffered | 忽略缓存 |
虽然QTextStream的写入内容与QDataStream一致,但是读取时却会有些困难:
点击(此处)折叠或打开
- QFile data("file.txt");
- if (data.open(QFile::ReadOnly)) {
- QTextStream in(&data);
- QString str;
- int ans = 0;
- in >> str >> ans;
- }
在使用QDataStream的时候,这样的代码很方便,但是使用了QTextStream时却有所不同:读出的时候,str 里面将是 The answer is 42,ans 是 0。这是因为以文本形式写入数据,是没有数据之间的分隔的。
默认情况下,QTextStream的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用
stream.setCodec("UTF-8");
http://blog.chinaunix.net/uid-24219701-id-4045207.html