首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Qt file文件操作详解

Qt file文件操作详解

作者头像
破晓的历程
发布2025-05-15 09:08:22
发布2025-05-15 09:08:22
4210
举报
文章被收录于专栏:破晓破晓

1.引言

很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件等等,甚至某些应用程序的就是为了操作文件,像WPS Office。基于此Qt框架中专门提供了对文件操作的类:QFile。

2.QFile文件操作

QFile类支持对文件进行读取和写入,删除,重命名,拷贝等常见的文件操作,它既可以操作文本文件,也可以用来操作二进制文件。

在Qt代码中我们使用QFIle类,需要先引入QFile的头文件:#include <QFile>。常见QFile类对象时,常见的构造函数有:

代码语言:javascript
复制
QFile()
QFile(QObject *parent)

参数parent 用来指定要操作的目标文件,包含文件的存储目录和文件名,存储路径可以使用绝对地址(比如"D:/Demo/text.txt")或者相对路径(比如"./Demo/text.txt")。路径中的分隔符要用"/"表示。

通常情况下,我们一般调用第二个构造函数来直接指明要操作的文件,对于第一个构造函数而言,我们还需要调用 setFileName()函数来指明要操作的文件。

与C++的读写规则一样,在对文件进行相关操作之前,我们需要先打开文件,打开文件我们使用 open函数。常用的语法格式为:

代码语言:javascript
复制
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 类读写文本文件的过程

代码语言:javascript
复制
#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实验二【演示】

代码语言:javascript
复制
#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 个整数的二进制形式,同时输出以下内容:

image-20250514104431780
image-20250514104431780

4.QFile+QTextStream

与单独使用QFile类相比,QTextStream类提供了很多读写文件相关的方法,还可以设定写入到文件的数据格式,比如对齐方式,写入数据是否带前缀等等。

使用QTextStream类之前,程序中需要先引入 头文件。QTextStream提供了很多构造方法,常用的有

am

与单独使用QFile类相比,QTextStream类提供了很多读写文件相关的方法,还可以设定写入到文件的数据格式,比如对齐方式,写入数据是否带前缀等等。

使用QTextStream类之前,程序中需要先引入 头文件。QTextStream提供了很多构造方法,常用的有

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.引言
  • 2.QFile文件操作
  • 3.演示示例
    • 3.1实验一
    • 3.2实验二【演示】
  • 4.QFile+QTextStream
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档