文件操作是应用程序必不可少的部分。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的有关操作:
点击(此处)折叠或打开
二进制文件读写
Qt 还供了更高一级的操作:用于二进制的流QDataStream和用于文本流的QTextStream。
QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。QDataStream可以很方便地对文件、网络套接字等进行读写操作。我们从代码开始看起:我们从代码开始看起:
点击(此处)折叠或打开
下面,我们要将这个数据读取出来:
点击(此处)折叠或打开
这段代码没什么好说的。唯一需要注意的是,你必须按照写入的顺序,将数据读取出来。
文本文件读写
QTextStream和QDataStream的使用类似,只不过它是操作纯文本文件的。
例如下面的代码将把“The answer is 42”写入到 file.txt 文件中:
点击(此处)折叠或打开
这里,我们在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一致,但是读取时却会有些困难:
点击(此处)折叠或打开
在使用QDataStream的时候,这样的代码很方便,但是使用了QTextStream时却有所不同:读出的时候,str 里面将是 The answer is 42,ans 是 0。这是因为以文本形式写入数据,是没有数据之间的分隔的。
默认情况下,QTextStream的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用
stream.setCodec("UTF-8");
http://blog.chinaunix.net/uid-24219701-id-4045207.html