57 文件和IO设备

为什么需要操作文件?

应用程序经常需要保留数据和配置信息,因此需要对文件进行读取或写入,有时候也需要对本地文件系统的文件或者目录进行操作。

QIODevice类的继承关系图

QIODevice 类是 Qt 所有 I/O 设备的基础类 ,为QFIle等类提供一个抽象接口,这些类中有的为顺序读取,有的为非顺序读取。

QBuffer和QTcpSocket等支持读写数据块的设备提供了一个抽象接口。QIODevice类是抽象的,无法被实例化,一般是使用它所定义的接口来提供设备无关的I/O功能。

在访问一个设备以前,需要使用open()函数打开该设备,而且必须指定正确的打开模式。QIODevice中所有的打开模式由QIODevice::OpenMode枚举类型定义,其取值如表所列,其中的一些值可以使用按位或符号“|”来同时使用。打开设备后可以使用write()或者putChar()来进行写入,使用read()、readLine()或者readAll()进行读取,最后使用close()关闭设备。

QIODevice会区别两种类型的设备:随机存取设备和顺序存储设备。 随机存取设备支持使用seek()函数来定位到任意的位置。文件中的当前位置可以使用pos()函数来获取。这样的设备有QFile、QBuffer等。 顺序存储设备不支持定位到任意的位置,数据必须一次性读取。pos()和size()等函数无法在操作顺序设备时使用。这样的设备有QTcpSocket、QProcess等。

打开模式有哪些?怎么操作?

枚举值

描述

QIODevice::NotOpen

未打开

QIODevice::ReadOnly

以只读方式打开

QIODevice::WriteOnly

以只写方式打开

QIODevice::ReadWrite

以读写方式打开

QIODevice::Append

以追加的方式打开,新增加的内容将被追加到文件末尾

QIODevice::Truncate

以重写的方式打开,在写入新的数据时会将游标设置在文件开头

QIODevice::Text

在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n

QIODevice::Unbuffered

忽略缓存