一文吃透QT文件处理:从入门到实战

目录

一、QT 文件处理初体验

二、QT 文件处理基础

(一)QT 文件处理相关类介绍

(二)文件的打开与关闭

三、QT 文件的读写操作

(一)文本文件读写

(二)二进制文件读写

四、QT 目录操作

(一)目录的创建与删除

(二)目录的遍历

五、QT 文件信息获取

5.1 文件名获取

5.2 文件大小获取

5.3 文件修改日期获取

5.4 文件创建日期获取

5.5 文件路径获取

5.6 文件后缀获取

5.7 文件权限判断

5.8 文件类型判断

六、实战案例:简易文件管理器

(一)功能需求分析

(二)界面设计

(三)核心代码实现

七、总结与展望


一、QT 文件处理初体验

        在进行 QT 开发时,文件处理是绕不开的重要环节。想象一下,你正在开发一个酷炫的图像编辑软件,用户希望能够将自己处理好的精美图片保存到本地,这就涉及到文件的写入操作;又或者开发一个智能音乐播放器,程序需要读取音乐文件的信息,像是歌名、歌手、时长等,这便是文件读取的实际应用场景。从简单的文本文件存储用户配置信息,到复杂的二进制文件处理多媒体数据,文件处理在 QT 开发中无处不在,是构建强大应用程序的基石。

二、QT 文件处理基础

(一)QT 文件处理相关类介绍

        在 QT 的文件处理领域,有几个关键类起着至关重要的作用。QFile 类作为文件操作的核心,就像是一把万能钥匙,能打开、关闭、读取、写入文件,还能对文件进行重命名、删除等操作 。比如,当你想要读取一个配置文件时,就可以创建一个 QFile 对象,指定文件路径,然后使用它的相关方法来读取文件内容。

        QTextStream 类则专注于文本数据的输入输出,它就像一个贴心的文本助手,能自动处理字符编码转换,让你在处理文本时无需过多操心编码问题。假设你要向一个文本文件中写入一段问候语 “Hello, World!”,使用 QTextStream 就能轻松实现。

        而 QDataStream 类,主要负责二进制数据的序列化和反序列化,它如同一个二进制数据的翻译官,将复杂的数据类型转化为字节流,便于在文件中存储或在网络中传输。比如,在保存游戏进度时,游戏中的角色属性、关卡信息等复杂数据,就可以通过 QDataStream 以二进制形式保存到文件中。

        QDir 类提供了对目录结构及其内容文件的修改、添加、删除、访问等操作,它就像是一个文件系统的导航仪,你可以用它创建目录、删除目录、遍历目录下的文件等。例如,你想创建一个新的文件夹来存放项目文件,QDir 就能帮你轻松完成。

        QFileInfo 类用于提取文件信息,包括路径、文件名、后缀等,它就像是文件的信息卡片,通过它可以获取文件的各种详细信息。当你拿到一个文件时,想知道它的创建时间、大小、权限等信息,QFileInfo 就能满足你的需求。

(二)文件的打开与关闭

        在 QT 中,使用 QFile 打开文件时,有多种模式可供选择。只读模式(QIODevice::ReadOnly)就像一个只能读取书籍内容的阅读器,你只能读取文件中的数据,不能对其进行修改。比如,当你打开一个日志文件查看历史记录时,就可以使用只读模式。

        只写模式(QIODevice::WriteOnly)则像是一个只能写入内容的笔记本,它会清空文件原有的内容,然后写入新的数据。假设你要创建一个新的文本文件并写入一些初始数据,就可以使用只写模式。

        读写模式(QIODevice::ReadWrite)结合了前两者的功能,既可以读取文件内容,也可以对文件进行写入操作,就像一本既可以阅读又可以书写的笔记本。例如,在开发一个文本编辑器时,就需要使用读写模式来实现对文件的编辑。

        追加模式(QIODevice::Append)则是在文件末尾添加新的数据,不会清空原有的内容,就像在笔记本的最后一页接着写新的内容。比如,在记录程序运行日志时,每次有新的日志信息,就可以使用追加模式添加到日志文件中。

        截断模式(QIODevice::Truncate)会在打开文件时清空文件内容,然后可以进行写入操作,就像把笔记本的所有页面清空后重新书写。

        以打开一个名为 “example.txt” 的文件进行读写操作为例,代码如下:

#include <QFile>

#include <QDebug>

int main() {

QFile file("example.txt");

if (file.open(QIODevice::ReadWrite)) {

qDebug() << "文件打开成功";

// 在这里进行文件读写操作

file.close();

} else {

qDebug() << "文件打开失败";

}

return 0;

}

        在上述代码中,首先创建了一个 QFile 对象,并指定要打开的文件名为 “example.txt”。然后使用 open () 方法尝试以读写模式打开文件,如果打开成功,就输出 “文件打开成功”,并可以在相应位置进行文件读写操作,最后使用 close () 方法关闭文件;如果打开失败,就输出 “文件打开失败” 。关闭文件是一个非常重要的操作,它能确保文件资源被正确释放,避免数据丢失或文件损坏等问题。就像你看完书后要把书合上放回原位,关闭文件就是在告诉系统,你已经使用完文件资源,可以进行后续的管理了。

三、QT 文件的读写操作

(一)文本文件读写

        QFile 单独读写文本文件:使用 QFile 类单独读写文本文件时,可以通过其提供的 read ()、readLine ()、write () 等函数来实现。例如,读取文件内容可以使用 readAll () 函数一次性读取整个文件内容,返回一个 QByteArray 类型的数据;或者使用 readLine () 函数按行读取文件内容,每次读取一行。写入文件时,可以使用 write () 函数将 QByteArray 类型的数据写入文件 。

下面是一个使用 QFile 单独读写文本文件的简单示例:

#include <QFile>

#include <QDebug>

int main() {

QFile file("test.txt");

if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {

QString content = "这是要写入文件的内容";

file.write(content.toUtf8());

file.close();

}

if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {

QByteArray data = file.readAll();

qDebug() << "读取的内容是:" << QString::fromUtf8(data);

file.close();

}

return 0;

}

        在上述代码中,首先以只写和文本模式打开文件 “test.txt”,如果打开成功,将字符串 “这是要写入文件的内容” 转换为 UTF - 8 编码的 QByteArray 类型数据,然后使用 write () 函数写入文件,最后关闭文件。接着,再次以只读和文本模式打开文件,如果打开成功,使用 readAll () 函数读取文件的全部内容,将读取到的 QByteArray 类型数据转换为 QString 类型并输出,最后关闭文件 。虽然这种方式能够实现文本文件的读写,但在处理复杂的文本操作,如格式化输出、自动编码转换时,会显得比较繁琐。比如,当需要按照特定格式写入数据,如将数字和字符串按照一定的对齐方式写入文件时,使用 QFile 单独操作就需要手动进行格式处理,代码会变得复杂且易错。

        QFile + QTextStream 读写文本文件:为了更方便地处理文本文件,QT 提供了 QTextStream 类,它与 QFile 结合使用可以大大简化文本文件的读写操作。QTextStream 类提供了一系列方便的方法,如 operator<<用于输出数据到流中,operator>> 用于从流中读取数据 ,还可以使用 setFieldAlignment () 设置字段对齐方式,setFieldWidth () 设置字段宽度等,以实现格式化输出。同时,QTextStream 能自动处理字符编码转换,让开发者无需过多关注编码细节,提高开发效率。例如,在不同操作系统之间传输文本文件时,QTextStream 会自动处理行尾结束符的转换,在 Windows 系统下将 “\n” 转换为 “\r\n”,在 Unix 系统下则保持 “\n” 不变。

        QTextStream 常用的格式描述符有 endl(换行) 、hex(十六进制输出)、dec(十进制输出)、oct(八进制输出)等。比如,使用 hex 描述符可以将数字以十六进制形式输出到文件中。

        下面通过一个代码示例来展示 QFile 和 QTextStream 结合使用读写文本文件的过程:

#include <QFile>

#include <QTextStream>

#include <QDebug>

int main() {

QFile file("test.txt");

if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {

QTextStream out(&file);

out << "姓名:" << "张三" << endl;

out << "年龄:" << 20 << endl;

file.close();

}

if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {

QTextStream in(&file);

QString line;

while (!in.atEnd()) {

in.readLineInto(&line);

qDebug() << "读取的行:" << line;

}

file.close();

}

return 0;

}

        在这个示例中,首先以只写和文本模式打开文件 “test.txt”,创建一个 QTextStream 对象 out,并将其与文件 file 关联。然后使用 out 对象的 operator<< 将格式化的文本数据写入文件,如 “姓名:张三”“年龄:20”,并使用 endl 换行。写入完成后关闭文件。接着,以只读和文本模式重新打开文件,创建 QTextStream 对象 in 与文件关联,使用 while 循环和 atEnd () 函数判断是否到达文件末尾,在循环中使用 readLineInto () 函数按行读取文件内容,并将每行内容输出到控制台,最后关闭文件 。通过这种方式,代码更加简洁易读,并且能轻松实现文本的格式化读写。

(二)二进制文件读写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨淅淅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值