【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文件操作的基础,还能够根据不同的应用需求选择合适的工具和方法,提高开发效率和程序的健壮性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何恢复已删除/丢失或未保存的 PDF 文件?

许多用户曾因某些问题删除或丢失 PDF 文件。此外&#xff0c;一些用户在关闭应用程序时未保存 PDF 文件&#xff0c;从而丢失 PDF 文件。您可以尝试一些解决方案来恢复已删除的 PDF 文件、恢复未保存的 PDF 文件&#xff0c;以及在任何其他数据丢失情况下挽救丢失的 PDF 文件。…

优化效率,简化流程:探索工资结算系统的重要性与实施方法

在现代企业中&#xff0c;工资结算是一项重要而复杂的任务。为了更好地管理和处理员工的工资事务&#xff0c;许多企业采用工资结算系统。本文将探讨工资结算系统的重要性&#xff0c;并介绍一些实施该系统的方法。 ### 1. 概述 工资结算系统是一种自动化的软件系统&#xff0…

apexcharts数据可视化之极坐标区域图

apexcharts数据可视化之极坐标区域图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基础极坐标区域图单色极坐标区域图 基础极坐标区域图 import ApexChart from react-apexcharts;export function BasicPolar() {// 数据序列const series…

【论文阅读|cryoET】DeepETPicker:使用弱监督深度学习的快速准确cryoET三维颗粒挑选算法

题目 DeepETPicker: Fast and accurate 3D particle picking for cryo-electron tomography using weakly supervised deep learning 发表期刊&#xff1a; Nature Communications 发表时间&#xff1a;2024.02 Accepted 作者&#xff1a;Guole Liu, Tongxin Niu 中科院自动化…

2024全新升级版家政服务小程序源码 支持家政预约+上门服务+SAAS系统+可二开

随着科技的飞速发展&#xff0c;家政服务行业也迎来了数字化转型的浪潮。为了满足市场日益增长的需求&#xff0c;分享一款2024全新升级版的家政服务小程序源码。该源码不仅支持家政预约和上门服务&#xff0c;还集成了SAAS系统&#xff0c;并支持二次开发&#xff0c;为用户带…

FLUKE福禄克DSX-5000或者DSX-8000如何做外部串扰测试之实践篇

近期&#xff0c;有很多朋友问如何使用DSX5000或者DSX8000测外部串扰&#xff1f; 外部串扰测试在判定外部线缆是否对网络传输造成影响的重要一环。 直接上干货&#xff0c;测试步骤如下&#xff1a; 第一步:对主机和副机进行基准设置&#xff0c;保持同步!官方是建议每24小时…

Discourse 安装后安全配置考虑

防火墙 防火墙是肯定要装机器上的&#xff0c;并且端口只开放了 443 和 22。 22 的端口还只限制了部分 IP 段的访问&#xff0c;通常只允许给内部网络的 SSH。 Web 服务应该只走 443&#xff0c;80 端口的做好自动重定向到 443。 CloudFlare 可以用一个 CloudFlare 的负载…

网络编程基础(四)

目录 前言 二、多点通信 2.1 单播 2.2 广播 2.2.1 广播得发送端实现--》类似与UDP的客户端 2.3 组播 2.3.1 组播发送端流程--》类似于UDP的客户端流程 2.3.2 组播的接收端流程---》类似于UDP的服务器端流程 前言 多点通信 一、套接字选项得获取和设置 int getsockopt(int…

Owinps静态IP代理:跨境电商的优选解决方案

在快速发展的电子商务领域&#xff0c;尤其是跨境电商行业&#xff0c;网络的稳定性和安全性是成功经营的关键因素之一。在这背后&#xff0c;少不得一个重要的跨境电商工具——代理IP&#xff0c;而这其中&#xff0c;静态IP因其独特的稳定性和安全性&#xff0c;正逐渐成为众…

linux中使用gdb调试c++的dump文件

1 查看系统是否开启dump生成 0表示没开启 ulimit -c 但是这个只是针对当前这个连接&#xff0c;如果想要永久修改可以修改配置文件&#xff1a;vim /etc/profile&#xff0c;然后添加上面的命令ulimit - c unlimited.然后执行source /etc/profile或者重启使刚刚的配置可以…

数控六面钻选购指南:如何挑选一款高效、精准的加工利器?

在木工家具、门窗制造等行业中&#xff0c;数控六面钻凭借其高效、精准的特点&#xff0c;逐渐成为现代生产线上的必备设备。然而&#xff0c;市场上的数控六面钻品牌众多&#xff0c;性能各异&#xff0c;如何选购一款适合自己的设备呢&#xff1f;本文将为您提供一份实用的选…

【稀疏三维重建】pixelSplat:仅需两张图,重建3D Gaussian Splats

文章目录 一.摘要二、相关工作 , 背景(gs)三、基于图像的三维高斯预测3.1 双视图图像编码器&#xff08;解决尺度模糊性&#xff09;3.2 &#xff08;像素对齐的&#xff09;高斯参数预测 四、实验效果 论文&#xff1a;《pixelSplat: 3D Gaussian Splats from Image Pairs for…

动态规划之买卖股票大集合

目录 引言 1.只能进行一次买卖股票&#xff08;最多只能买一股股票&#xff09; 2.可以进行多次股票买卖&#xff0c;且没有手续费&#xff08;最多只能买一股股票&#xff09; 3.可以进行多次股票买卖&#xff0c;但是有冷冻期&#xff0c;无手续费&#xff08;最多只能买一…

常用压力、流量单位换算表

一、压力为单位面积所承受的力 压力&#xff1a;绝对压力 、表压力 、大气压力。相互关系&#xff1a;绝对压力表压力大气压力 绝对压力:当压力表示与完全真空的差。测量处的实际压力。 表压力:当表示其气体数值与该地域大气压力的差值。 大气压力&#xff1a;由大气重量所…

基于C++11实现的手写线程池

在实际的项目中&#xff0c;使用线程池是非常广泛的&#xff0c;所以最近学习了线程池的开发&#xff0c;在此做一个总结。 源码&#xff1a;https://github.com/Cheeron955/Handwriting-threadpool-based-on-C-17 项目介绍 项目分为两个部分&#xff0c;在初版的时候&#x…

让EXCEL VBA支持鼠标滚轮,vb6 IDE鼠标滚轮插件原理

vb6 IDE鼠标滚轮插件怎么运行的(适用于VBA) 使用 Spy&#xff0c;我发现代码窗口正在获取 WM_MOUSEWHEEL 事件&#xff0c;但没有触发 WM_VSCROLL 消息。因此&#xff0c;我编写了一个简单的消息钩子&#xff0c;当它捕获鼠标滚轮事件时触发滚动事件。 我从 Spy 得知代码窗口的…

SQL数据库多层嵌套 json转sql建表语句,SQL数据库里数组里对象数据怎么创建

1. uniapp sqlite 一个数组包含对象嵌套对象通过主外键方式插入数据库&#xff1a; // 假设有一个对象数组&#xff0c;对象中包含嵌套对象 const objectsArray [{parentObject: {id: 1,name: Parent 1,// 其他父对象属性},childObject: {id: 11,parentId: 1,name: Child 1 o…

截图工具分享(Snipaste、FastStone Capture)

目录 一、背景二、Snipaste 截图工具三、FastStone Capture 截图工具 一、背景 在我们日常的学习、工作中&#xff0c;经常会需要使用到各种各样的截图场景&#xff0c;甚至有部分同学还不知道仅仅通过截图的运用就可以大大提升自己的学习效率和工作效率。在这篇文章中&#xf…

如何解决链游中可能出现的延迟或网络拥堵问题?

随着区块链技术的不断发展和普及&#xff0c;链游&#xff08;基于区块链的游戏&#xff09;作为新兴的娱乐形式&#xff0c;正逐渐走进大众的视野。然而&#xff0c;与传统游戏相比&#xff0c;链游在运行过程中可能会遇到一些特有的问题&#xff0c;其中最为突出的就是延迟和…

宝塔下应该用 Memcached 还是 Redis?

明月最近在跟几个使用宝塔面板的客户运维的时候发现不少站长不知道如何选择 Memcached 和 Redis&#xff0c;甚至都说不清楚 Memcached 或者 Redis 具体是用来干啥的&#xff1f;甚至还碰到过一个站长 Memcached 和 Redis 都安装了&#xff0c;但一个都没有用&#xff0c;就那么…