【Qt】Qt框架文件处理精要:API解析与应用实例:QFile

文章目录

  • 前言:
  • 1. Qt 文件概述
  • 2. 输入输出设备类
  • 3. 文件读写类
    • 3.1. 打开open
    • 3.2. 读read / readline/ readAll
    • 3.3. 写write
    • 3.4. 关闭close
  • 4. 读写文件示例
  • 5. 文件件和目录信息类
  • 总结:

前言:

在现代软件开发中,文件操作是应用程序与外部世界交互的基本方式之一。无论是读取用户数据、存储配置信息,还是管理临时文件,文件系统都是不可或缺的一部分。Qt,作为一个功能强大的跨平台开发框架,提供了一套全面的文件操作API,使得开发者能够在不同的操作系统上实现一致的文件处理逻辑。本篇文章将深入探讨Qt中的文件操作,包括文件的打开、读写、关闭,以及文件和目录信息的获取等核心功能。通过详细的代码示例和类介绍,读者将能够理解并掌握Qt文件操作的基本概念和实用技巧。

1. Qt 文件概述

文件操作是应用程序必不可少的部分。Qt 作为一个用开发库,提供了跨平台的文件操作能力。 Qt提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。

2. 输入输出设备类

  • C语言中,fopen 打开文件,freadfwrite 读写文件,fclose 关闭文件
  • C++ 中,fstream 打开文件,<<>> 读写文件,close 关闭文件
  • Linux 中,open 打开文件,readwrite 读写文件,close 关闭文件 (一般开发中很少会直接使用,主要是要理解其背后的原理)

在 Qt 中使用上述的几种方案来读写文件,也是完全可以的。(Linux 这一套,局限于 Linux 系统,Windows 上的 Qt,就需要使用 Windows api) 但是即使如此,Qt还是又封装了一套。 Qt 诞生的太早了,C++还没有“标准化”概念。
咱们在编写 Qt 程序的时候,更推荐使用 Qt 自己提供的这一套文件操作,和QString等 Qt 内置的类可以很好的配合。

Qt中的文件操作,核心操作也是这么几个部分:打开,读,写,关闭。
QFile 类完成,完成上述文件操作。
在这里插入图片描述
QTemporaryFile: 这个对象销毁,对应的文件就自动删除了
QSaveFile: 要写入大量数据,写入文件的时候,往往会把旧的文件先清空再写,万一新的数据写写一般,结果出错了。新的数据用不了旧的数据也无了。

如果你想写一个文件,会自动的把内容写到零时文件里(不会破坏原有的文件)等到所有内容都写完了之后,再把旧文件自动删除,并且用新的文件替换旧的文件。(这种策略是一种个广泛常见)

QSerialPort: 串口一种古老的通信方式,一般是再嵌入式系统上,开发板,通过串口来和开发板之间进行交互。
QProcess: 相当于是对 fork / exec 操作进行封装。
QBuffer:缓冲区

3. 文件读写类

QFile

QFile(const QString &name)

可以是绝对路径,也可以是相对路径

如果在文档中 QFile 中找不到这些,可以在其父类找。

3.1. 打开open

在这里插入图片描述
构造函数中,指定了路径之后,此时直接通过这个版本的 open 打开
在这里插入图片描述
OpenMode: 读方式、写方式、追加写方式…
在这里插入图片描述

3.2. 读read / readline/ readAll

在这里插入图片描述
QByteArry 很方便转成 QString

3.3. 写write

在这里插入图片描述

3.4. 关闭close

在这里插入图片描述
关闭的本质是要释放文件描述符表中的表项;文件描述符表存在上限,如果一直打开,不关闭的话,就可能会使文件描述符表被占满,后续再尝试打开,就打开不了了。

4. 读写文件示例

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFileDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setWindowTitle("简单的记事本");

    // 获取到菜单栏
    QMenuBar* menuBar = this->menuBar();

    // 添加菜单
    QMenu* menu = new QMenu("文件");
    menuBar->addMenu(menu);

    // 添加菜单项
    QAction* action1 = new QAction("打开");
    QAction* action2 = new QAction("保存");
    menu->addAction(action1);
    menu->addAction(action2);

    // 指定一个输入框
    _edit = new QPlainTextEdit();
    QFont font;
    font.setPixelSize(20);
    _edit->setFont(font);
    this->setCentralWidget(_edit);

    // 连接 QAction 的信号槽
    connect(action1, &QAction::triggered, this, &MainWindow::handleAction1);
    connect(action2, &QAction::triggered, this, &MainWindow::handleAction2);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handleAction1()
{
    // 1. 先弹出 "打开文件" 对话框,让用户选择打开哪个文件
    QString path = QFileDialog::getOpenFileName(this);

    // 2. 把文件名显示到状态栏里
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);

    // 3. 根据用户选择路径,构造一个 QFile 对象,并打开文件
    QFile file(path);
    bool ret = file.open(QFile::ReadOnly);
    if (!ret) {
        // 打开文件失败
        statusBar->showMessage(path + "打开失败");
        return;
    }

    // 4. 读取文件了
    QString text = file.readAll();

    // 5. 关闭文件!!! 千万不要忘记!
    file.close();

    // 6. 读到的内容设置到输入框中
    _edit->setPlainText(text);
}

void MainWindow::handleAction2()
{
    // 1. 先弹出 “保存文件” 对话框
    QString path = QFileDialog::getSaveFileName(this);

    // 2. 在状态栏中显示这个文件名
    QStatusBar* statusBar = this->statusBar();
    statusBar->showMessage(path);

    // 3. 根据用户选择的路径,构造一个 QFile 对象,并且打开文档
    QFile file(path);
    bool ret = file.open(QFile::WriteOnly);
    if (!ret) {
        statusBar->showMessage(path + "打开失败!");
        return;
    }

    // 4. 写文件
    const QString& text = _edit->toPlainText();
    file.write(text.toUtf8());

    // 5. 关闭文件
    file.close();
}

在这里插入图片描述

QString text = file.readAll();

需要确保打开的文件是一个文本文件才可以,如果是二进制文件,交给 QString 就不合适了。
二进制文件:里面的内容存啥都行,没有限制。图片,可执行程序,音频,视频…
文本文件:里面的内容必须是合法字符(遵守 utf8, gbk 等编码方式)

5. 文件件和目录信息类

QFileInfo 可以获取到 Qt 文件的相关属性。类似于这样的功能,在 C/C++ 标准库中原本是没有的,所以要想使用类似的功能往往要使用系统 api。
C++17 引入了模块,filesystem

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QFileInfo>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    // 弹出文件对话框,并获取到文件属性信息
    QString path = QFileDialog::getOpenFileName(this);
    // 构造出一个 QFileInfo 对象
    QFileInfo fileInfo(path);
    // 打印相关属性
    qDebug() << fileInfo.fileName();
    qDebug() << fileInfo.suffix();
    qDebug() << fileInfo.path();
    qDebug() << fileInfo.size();
    qDebug() << fileInfo.isFile();
    qDebug() << fileInfo.isDir();
    // ...
}

在这里插入图片描述
QFileInfo还有很多操作方法:
在这里插入图片描述

总结:

本文详细介绍了Qt框架中关于文件操作的各个方面,从基础的文件读写到文件和目录信息的获取,为开发者提供了一套完整的文件处理解决方案。通过QFile类,我们可以实现文件的打开、读取、写入和关闭等操作,同时QFileInfo类则提供了获取文件属性的便捷方式。文章中提供的代码示例进一步展示了如何在实际的Qt应用程序中应用这些API,帮助开发者快速上手并解决文件操作中可能遇到的问题。

此外,文章还提到了Qt中的一些特殊文件操作类,如QTemporaryFile、QSaveFile、QSerialPort和QProcess等,这些类在特定场景下提供了额外的功能,增强了文件操作的灵活性和安全性。通过本文的学习,开发者不仅能够掌握Qt文件操作的基础,还能够根据不同的应用需求选择合适的工具和方法,提高开发效率和程序的健壮性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

好消息!DolphinScheduler官网集成LLM模型问答AI kapa.ai

不少小伙伴可能发现了&#xff0c;Apache DolphinScheduler官网最近默默上线了kapa.ai作为LLM的问答AI。 集成kapa.ai之后&#xff0c;社区用户可以点击Apache DolphinScheduler官网首页右下角的「Ask AI」模块&#xff0c;在接下来弹出的问答框输入自己的问题&#xff0c;即可…

uniapp通过Canvas绘制网格(心电图,坐标纸等可用)

本篇文档是Canvas绘制心电图的第一个部分&#xff0c;想了解详情的可以关注后学习交流。 心电图的最底层需要一个网状底层&#xff0c;来方便进行数据的测量。 一、白底分大、中、小三个区域的网格 1、首先是HTML部分 <!DOCTYPE html> <html lang"en">…

睿联技术对亚马逊既依赖又竞争:递表前大额分红,资金充裕又补流?

《港湾商业观察》施子夫 王璐 今年3月29日&#xff0c;冲刺创业板IPO的深圳市睿联技术股份有限公司&#xff08;以下简称&#xff0c;睿联技术&#xff09;提交了注册&#xff0c;不出意外的话&#xff0c;公司离挂牌上市已经近在咫尺。 然而&#xff0c;在目前资本市场尤其…

HNU-计算机体系结构-期末复习

前言 这是新开的课程&#xff0c;故历年考题有限。2024年期末考试的情况像大默写。期末试卷回忆在这里&#xff1a; 计算机体系结构-2024期末考试-CSDN博客 不知道结果怎么样&#xff0c;希望别太对不起付出吧。 资源推荐 本着不重复造轮子的原则&#xff0c;这里推荐学长以…

大模型培训 AUTOWEBGLM:自动网页导航智能体

大语言模型&#xff08;LLMs&#xff09;在智能代理任务中发挥着重要作用&#xff0c;尤其是在网络导航方面。然而&#xff0c;现有的代理在真实世界的网页上表现不佳&#xff0c;主要原因网络导航代理面临着三大挑战&#xff1a;网页上行动的多样性、HTML文本的处理限制以及开…

127.0.0.1 和 localhost 以及 0.0.0.0 区别

之前用 nginx 的时候&#xff0c;发现用这几个 IP&#xff0c;都能正常访问到 nginx 的欢迎网页。一度认为这几个 IP 都是一样的。 但本质上还是有些区别的。 首先 localhost 就不叫 IP&#xff0c;它是一个域名&#xff0c;就跟 "baidu.com",是一个形式的东西&…

开放式耳机推荐品牌:五款品质超凡机型必须选购

在这个快节奏的生活中&#xff0c;我们每个人都渴望在忙碌之余找到一片属于自己的宁静。音乐&#xff0c;作为连接心灵的桥梁&#xff0c;无疑是最为直接和有效的途径。而一款优秀的开放式耳机&#xff0c;不仅能让我们沉浸在美妙的旋律中&#xff0c;还能在保持对外界环境感知…

汇编原理(三)编程

源程序&#xff1a; 汇编指令&#xff1a;有对应的机器码与其对应 伪指令&#xff1a;无对应的机器码&#xff0c;是由编译器来执行的指令&#xff0c;编译器根据伪指令来进行相关的编译工作。 ex1:XXX segment、XXX ends这两个是一对成对使用的伪指令&#xff0c;且必须会被用…

HNU-计算机体系结构-实验3-缓存一致性

计算机体系结构 实验3 计科210X 甘晴void 202108010XXX 文章目录 计算机体系结构 实验31 实验目的2 实验过程2.0 预备知识2.0.1 多cache一致性算法——监听法2.0.1.1 MSI协议2.0.1.2 MESI协议2.0.1.3 本题讲解 2.0.2 多cache一致性算法——目录法2.0.2.1 有中心的目录法2.0.2…

摸鱼大数据——Hive表操作——复杂类型

1、hvie的SerDe机制 其中ROW FORMAT是语法关键字&#xff0c;DELIMITED和SERDE二选其一。本次我们主要学习DELIMITED关键字相关知识点 如果使用delimited: 表示底层默认使用的Serde类:LazySimpleSerDe类来处理数据。 如果使用serde:表示指定其他的Serde类来处理数据,支持用户自…

无需安装的在线PS:打开即用

为什么想用在线PS网页版&#xff1f;Photoshop常用于平面设计&#xff0c;是不少设计师接触过的第一款设计软件。作为一款平面设计工具&#xff0c;ps功能太多&#xff0c;并且没有在线版&#xff0c;这不仅需要设计师花费时间学习软件&#xff0c;还需要设计师具备一定的设计能…

Ant Design 动态增减form表单,第二三项根据第一项选中内容动态展示内容

效果图&#xff1a; 选中第一项下拉框&#xff0c;第二第三项展示 点击添加条件&#xff0c;第二条仍然只展示第一项select框 后端返回数据格式&#xff1a; ruleList:[{name:通话时长,key:TALK_TIME,type&#xff1a;’INT‘,unitName:秒,operaObj:[{name:>,value:>…

[JAVASE] String类 StringBuffer类 StringBuilder类

目录 一.String类 1.1 String字符串不可变的原因 1.2 字符串中的比较方法 1.2.1 equals 1.2.2 compareTo 与 compareToIgnoreCase 1.3 字符串中的查找方法 1.3.1 charAt 1.3.2 indexOf 与 lastIndexOf 1.4 字符串中的转换方法 1.4.1 valueOf 1.4.2 toUpperCase 与 to…

msi安装mysql8 启动失败,提示只有在任务处于完成状态(RanToCompletion、Faulted 或 Canceled)时才能释放它。

解决方案: 1.打开服务,找到安装的mysql 2. 右击&#xff0c;打开属性&#xff0c;进入【登录】选项卡&#xff0c;选择本地系统账户。 3. 点击确定-->应用 4.服务中选择开始服务 5.服务启动成功后,在安装步骤中继续点击执行

熵值法(熵权法)

熵值法&#xff08;Entropy Method&#xff09;是一种多属性决策分析方法&#xff0c;主要用于权重确定、排序和评价。它在风险评估、资源配置、环境管理等领域得到广泛应用。熵值法的核心思想是基于信息熵的概念&#xff0c;利用信息熵来度量各属性对决策的贡献程度&#xff0…

串口环保212设备 转 profinet IO协议项目案例

1 文档说明 数采仪通过串口输出环保212的数据&#xff0c;vfbox网关通过串口采集数采仪的数据。网关把采集的数据转换成Profinet IO从站数据。 2 测试数采仪的串口数据 测试数采仪的串口有数据输出&#xff0c;并且需要知道输出的数据内容。 把数采仪的串口&#xff08;232或…

【记录】打印|无需排版,生成证件照打印PDF,打印在任意尺寸的纸上(简单无损!)

以前我打印证件照的时候&#xff0c;我总是在网上找在线证件照转换或者别的什么。但是我今天突然就琢磨了一下&#xff0c;用 PDF 打印应该也可以直接打印出来&#xff0c;然后就琢磨出来了&#xff0c;这么一条路大家可以参考一下。我觉得比在线转换成一张 a4 纸要方便的多&am…

AI视频教程下载:ChatGPT API、HTML、CSS 和 JS开发AI聊天机器人

在课程中,你将开启一段令人兴奋的聊天机器人开发之旅,并装备自己创建智能对话代理所需的技能和知识。 利用 ChatGPT API、HTML、CSS 和 JavaScript 的强大功能,你将学习如何设计和构建吸引用户并提供个性化体验的聊天机器人界面。深入探讨聊天机器人开发的基础知识,了解对话设…

给转行产品经理的小白的一些建议

哈喽我是小源&#xff0c;毕业在教培大厂做了1年的班主任&#xff0c;下午1点上班&#xff0c;被优化后gap3月找到了自己的本命岗位——产品经理&#xff01; 其实这个转变也挺机缘巧合的&#xff0c;朋友和我都是教培行业&#xff0c;她是成人职教类&#xff0c;我是k111类&a…

SWM181系列应用

一、SWM181系列 ISP功能 1.1、注意&#xff1a;ISP引脚为B0&#xff0c;VCC&#xff0c;GND是UART-RX、UART-TX 下载引脚。所有型号的UART-RX - - > A0&#xff0c;UART-TX - - > A1。 1.2、注意&#xff1a;板级设计必须留出ISP引脚&#xff0c;防止调试过程中芯片锁死后…