Qt file文件操作详解
1.引言
很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件等等,甚至某些应用程序的就是为了操作文件,像WPS Office。基于此Qt框架中专门提供了对文件操作的类:QFile。
2.QFile文件操作
QFile类支持对文件进行读取和写入,删除,重命名,拷贝等常见的文件操作,它既可以操作文本文件,也可以用来操作二进制文件。
在Qt代码中我们使用QFIle类,需要先引入QFile的头文件:#include <QFile>
。常见QFile类对象时,常见的构造函数有:
QFile()
QFile(QObject *parent)
参数parent
用来指定要操作的目标文件,包含文件的存储目录和文件名,存储路径可以使用绝对地址(比如"D:/Demo/text.txt")或者相对路径(比如"./Demo/text.txt")。路径中的分隔符要用"/"表示。
通常情况下,我们一般调用第二个构造函数来直接指明要操作的文件,对于第一个构造函数而言,我们还需要调用 setFileName()
函数来指明要操作的文件。
与C++的读写规则一样,在对文件进行相关操作之前,我们需要先打开文件,打开文件我们使用 open函数
。常用的语法格式为:
bool QFile::open(OpenMode Mode);
Mode参数表示不同的打开方式,下列罗列了参数的可选值和及其不同的含义:
打开模式 | 含义 |
---|---|
QIODevice::ReadOnly | 以只读模式打开文件。 |
QIODevice::WriteOnly | 以只写模式打开文件。如果文件不存在,将创建新文件;如果文件已存在,其内容将被清空。 |
QIODevice::ReadWrite | 以读写模式打开文件。 |
QIODevice::Append | 以追加模式打开文件,写入的数据将追加到文件末尾,原有内容保留。 |
QIODevice::Truncate | 打开文件时清空其内容。通常与 WriteOnly 或 ReadWrite 一起使用。 |
QIODevice::Text | 在文本模式下打开文件,处理不同平台的行结束符(如将 Windows 的 \r\n 转换为 \n )。 |
QIODevice::Unbuffered | 以非缓冲模式打开文件,数据将直接写入磁盘而不经过缓冲区。 |
根据需要我们可以一次性选择多个值,值和值之前使用 |
来进行分割,比如:
QIODevice::ReadOnly
|QIODevice::Text
表示只允许对文件进行读操作,读取文件时,会将行尾结束符转换为 ‘\n’;
QIODevice::WriteOnly
|QIODevice::Text
表示只允许对文件进行写操作,将数据写入文件时,会将行尾结束符转换为本地格式;
QIODevice::ReadWrite
|QIODevice::Text
|QIODevice::Append
但选择的多个值之前不能相互冲突,比如比如 Append 和 Truncate 不能同时使用。
如果文件成功打开,open() 函数返回 true,否则返回 false。
QFile 类提供了很多功能实用的方法,可以快速完成对文件的操作,下表列举了常用的一些:
qint64 QFile::size() const | 获取当前文件的大小。对于打开的文件,该方法返回文件中可以读取的字节数。 |
---|---|
bool QIODevice::getChar(char *c) | 从文件中读取一个字符,并存储到 c 中。读取成功时,方法返回 true,否则返回 false。 |
bool QIODevice::putChar(char c) | 向文件中写入字符 c,成功时返回 true,否则返回 false。 |
QByteArray QIODevice::read(qint64 maxSize) | 从文件中一次性最多读取 maxSize 个字节,然后返回读取到的字节。 |
qint64 QIODevice::read(char *data, qint64 maxSize) | 从文件中一次性对多读取 maxSize 个字节,读取到的字节存储到 data 指针指定的内存控件中。该方法返回成功读取到的字节数。 |
QByteArray QIODevice::readAll() | 读取文件中所有的数据。 |
qint64 QIODevice::readLine(char *data, qint64 maxSize) | 每次从文件中读取一行数据或者读取最多 maxSize-1 个字节,存储到 data 中。该方法返回实际读取到的字节数。 |
qint64 QIODevice::write(const char *data, qint64 maxSize) | 向 data 数据一次性最多写入 maxSize 个字节,该方法返回实际写入的字节数。 |
qint64 QIODevice::write(const char *data) | 将 data 数据写入文件,该方法返回实际写入的字节数。 |
qint64 QIODevice::write(const QByteArray &byteArray) | 将 byteArray 数组中存储的字节写入文件,返回实际写入的字节数。 |
bool QFile::copy(const QString &newName) | 将当前文件的内容拷贝到名为 newName 的文件中,如果成功,方法返回 true,否则返回 false。 copy 方法在执行复制操作之前,会关闭源文件。 |
bool QFile::rename(const QString &newName) | 对当前文件进行重命名,新名称为 newName,成功返回 true,失败返回 false。 |
bool QFile::remove() | 删除当前文件,成功返回 true,失败返回 false。 |
3.演示示例
3.1实验一
演示了 QFile
类读写文本文件的过程
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{//创建 QFile 对象,同时指定要操作的文件QFile file("D:/demo.txt");//对文件进行写操作if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){qDebug()<<"文件打开失败";}//向文件中写入两行字符串file.write("hello\r\n");file.write("world");//关闭文件file.close();//重新打开文件,对文件进行读操作if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){qDebug()<<"文件打开失败";}//每次都去文件中的一行,然后输出读取到的字符串char * str = new char[100];qint64 readNum = file.readLine(str,100);//当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取while((readNum !=0) && (readNum != -1)){qDebug() << str;readNum = file.readLine(str,100);}file.close();return 0;
}
3.2实验二【演示】

#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{//指定要写入文件的数据qint32 nums[5]={1,2,3,4,5};//写入文件之前,要将数据以二进制方式存储到字节数组中QByteArray byteArr;byteArr.resize(sizeof(nums));for(int i=0;i<5;i++){//借助指针,将每个整数拷贝到字节数组中memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));}//将 byteArr 字节数组存储到文件中QFile file("D:/demo.dat");file.open(QIODevice::WriteOnly);file.write(byteArr);file.close();//再次打开文件,读取文件中存储的二进制数据file.open(QIODevice::ReadOnly);QByteArray resArr = file.readAll();//输出读取到的二进制数据qDebug()<<"resArr: "<<resArr;//将二进制数据转化为整数char* data = resArr.data();while(*data){qDebug() << *(qint32*)data;data += sizeof(qint32);}return 0;
}
执行程序,demo.dat 文件中会存储 {1,2,3,4,5} 这 5 个整数的二进制形式,同时输出以下内容:
4.QFile+QTextStream
与单独使用QFile类相比,QTextStream类提供了很多读写文件相关的方法,还可以设定写入到文件的数据格式,比如对齐方式,写入数据是否带前缀等等。
使用QTextStream类之前,程序中需要先引入 头文件。QTextStream提供了很多构造方法,常用的有
am
与单独使用QFile类相比,QTextStream类提供了很多读写文件相关的方法,还可以设定写入到文件的数据格式,比如对齐方式,写入数据是否带前缀等等。
使用QTextStream类之前,程序中需要先引入 头文件。QTextStream提供了很多构造方法,常用的有