Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图(Qt5):
QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
QFlie:访问本地文件或者嵌入资源;
QTemporaryFile:创建和访问本地文件系统的临时文件;
QBuffer:读写QbyteArray, 内存文件;
QProcess:运行外部程序,处理进程间通讯;
QAbstractSocket:所有套接字类的父类;
QTcpSocket:TCP协议网络数据传输;
QUdpSocket:传输 UDP 报文;
QSslSocket:使用 SSL/TLS 传输数据;
1、文件的基本操作
QFile提供了从文件中读取和写入数据的能力。我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。我们可以使用QDataStream或QTextStream类来读写文件,也可以使用QIODevice类提供的read()、readLine()、readAll()以及write()这样的函数,返回值为QByteArray。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取,默认为UTF-8编码方式,而不是自己分析文件路径字符串。示例如下:
//使file与in.txt相关联
QFile file("in.txt");
//以只读文本的方式打开该文件
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "Open file failed.";
return -1;
}
else
{
while (!file.atEnd())
{
//每次读取一行
qDebug() << file.readLine();
}
}
file.close();
/*
枚举值 描述
QIODevice::NotOpen 未打开
QIODevice::ReadOnly 以只读方式打开
QIODevice::WriteOnly 以只写方式打开
QIODevice::ReadWrite 以读写方式打开
QIODevice::Append 以追加的方式打开,新增加的内容将被追加到文件末尾
QIODevice::Truncate 以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。
QIODevice::Text 在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n
QIODevice::Unbuffered 忽略缓存
*/
2、二进制读写
QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。可以直接读写没有编码的二进制数据,例如图像、视频、音频等。示例如下:
QFile file("file.dat");
file.open(QIODevice::ReadWrite);
//关联文件
QDataStream stream(&file);
QString str = "the answer is 42";
//借助QDataStream 将内容以二进制的形式输入文件
stream << str;
file.close();
3、文本方式读写
QTextStream会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。QTextStream同QDataStream的使用基本一致。当使用QDataStream写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而以文本形式写入数据,是没有数据之间的分隔的。所以使用QTextStream写入二进制数据后,再重新读出是会出错的。所以一般读出使用
- QString QTextStream::readLine() 读取一行
- QString QTextStream::readAll()读取所有文本
默认情况下,QTextStream的编码格式是 Unicode,如果我们需要使用另外的编码,可以使用:stream.setCodec("UTF-8");