当前位置: 首页 > news >正文

【Qt】Qt文件

QFile文件概述 

在C语言中:

  • fopen:打开文件;
  • fread:读文件
  • fwrite:写文件
  • fclose:关闭文件

在C++中:

  • fstream:打开文件
  • <<:读文件
  • >>:写文件
  • close:关闭文件

在Linux中:

  • open:打开文件
  • read:读文件
  • write:写文件
  • close:关闭文件

一般在开发过程中很少会直接使用,主要时理解文件操作背后的原理。

在Qt中,使用上述的几种方案来读写文件,也是完全可以(Linux局限于Linux系统,windows上的Qt,就需要使用Windows spi)

与此同时,Qt也提供了一套文件操作,这是由于Qt诞生的过于早,C++还没有“标准化”概念,在编写Qt程序的时候,更推荐使用Qt自己提供的这一套文件操作,和QString等Qt内置的类可以很好的配合。

Qt中的文件操作,核心操作也是这几个部分:打开、读、写、关闭。在Qt中使用QFile类来完成上述文件操作。 

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

输入输出设备类

        在 Qt 中,⽂件读写的类为 QFile 。QFile 的⽗类为 QFileDevice ,QFileDevice 提供了⽂件交互操作的底层功能。 QFileDevice 的⽗类是 QIODevice,QIODevice 的⽗类为 QObject 。

        QIODevice 是 Qt 中所有输⼊输出设备(input/output device,简称 I/O 设备)的基础类,I/O 设备就是能进⾏数据输⼊和输出的设备,例如⽂件是⼀种 I/O 设备,⽹络通信中的 socket 是 I/O 设备, 串⼝、蓝⽛等通信接⼝也是 I/O 设备,所以它们也是从 QIODevice 继承来的。

  • QFile 是⽤于⽂件操作和⽂件数据读写的类,使⽤ QFile 可以读写任意格式的⽂件。
  • QSaveFile 是⽤于安全保存⽂件的类。使⽤ QSaveFile 保存⽂件时,它会先把数据写⼊⼀个临时⽂件,成功提交后才将数据写⼊最终的⽂件。如果保存过程中出现错误,临时⽂件⾥的数据不会被写⼊最终⽂件,这样就能确保最终⽂件中不会丢失数据或被写⼊部分数据。 在保存⽐较⼤的⽂件或复杂格式的⽂件时可以使⽤这个类,例如从⽹络上下载⽂件等。
  • QTemporaryFile 是⽤于创建临时⽂件的类。使⽤函数 QTemporaryFile::open() 就能创建⼀个⽂件名唯⼀的临时⽂件,在 QTemporaryFile 对象被删除时,临时⽂件被⾃动删除。
  • QTcpSocket 和 QUdpSocket 是分别实现了 TCP 和 UDP 的类。
  • QSerialPort 是实现了串⼝通信的类,通过这个类可以实现计算机与串⼝设备的通信。
  • QBluetoothSocket 是⽤于蓝⽛通信的类。⼿机和平板计算机等移动设备有蓝⽛通信模块,笔记本电脑⼀般也有蓝⽛通信模块。通过QBluetoothSocket类,就可以编写蓝⽛通信程。如编程实现笔记本电脑与⼿机的蓝⽛通信。
  • QProcess 类⽤于启动外部程序,并且可以给程序传递参数。
  • QBuffer 以⼀个 QByteArray 对象作为数据缓冲区,将 QByteArray 对象当作⼀个 I/O 设备来读写。

文件读写类

QFile:

  1. 打开:open
  2. 读:read
  3. 写:write
  4. 关闭:close

在 Qt 中,⽂件的读写主要是通过 QFile 类来实现。在 QFile 类中提供了⼀些⽤来读写⽂件的⽅法。对于⽂件的操作主要有:

  • 读数据:QFile 类中提供了多个⽅法⽤于读取⽂件内容;如 read()、readAll()、readLine()等。

  • 写数据:QFile 类中提供了多个⽅法⽤于往⽂件中写内容;如 write()、writeData()等。

  • 关闭⽂件:⽂件使⽤结束后必须⽤函数 close() 关闭⽂件。

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

        访问⼀个设备之前,需要使⽤ open()函数 打开该设备,⽽且必须指定正确的打开模式,QIODevice 中所有的打开模式由 QIODevice::OpenMode 枚举变量定义,其取值如下:

QIODevice::NotOpen

没有打开设备

QIODevice::ReadOnly

以只读⽅式打开设备

QIODevice::WriteOnly

以只写⽅式打开设备

QIODevice::ReadWrite

以读写⽅式打开设备

QIODevice::Append

以追加⽅式打开设备,数据将写到⽂件末尾

QIODevice::Truncate

每次打开⽂件后重写⽂件内容,原内容将被删除

QIODevice::Text

在读⽂件时,⾏尾终⽌符会被转换为 '\n';当写⼊⽂件时,⾏尾终⽌符会被转换为本地编码。如 Win32上为'\r\n';

QIODevice::Unbuffered

⽆缓冲形式打开⽂件,绕过设备中的任何缓冲区

QIODevice::NewOnly

⽂件存在则打开失败,不存在则创建⽂件

例子:实现简单的记事本

(1)初始化菜单栏以及输入框

  1. 获取到菜单栏
  2. 添加菜单——文件
  3. 添加俩个菜单项——打开、保存
  4. 设置一个输入框,设置字体大小、将输入框显示到控件中心
  5. 连接 QAction 的信号槽

(2)

  1. 弹出“打开文件”对话框,让用户选择需要打开的文件
  2. 设置状态栏,将文件路径显示到状态栏中。
  3. 根据选择的路径,构造一个QFile对象,并打开文件,如果打开文件失败需要在状态栏中显示
  4. 读取文件
  5. 关闭文件(注意不要忘记)
  6. 读取到的内容设置到输入框中。

QString text = flie.readAll();

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

(3)

  1. 弹出“保存文件”对话框
  2. 设置状态栏,将文件路径显示到状态栏中。
  3. 根据选择的路径,构造一个QFile对象,并打开文件,如果打开文件失败需要在状态栏中显示
  4. 写文件
  5. 关闭文件

(4)运行程序

(5)代码展示

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QFileDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 1.获取到菜单栏QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);// 2.添加菜单——文件QMenu* menu = new QMenu("文件");menuBar->addMenu(menu);// 3.添加俩个菜单项——打开、保存QAction* action1 = new QAction("打开");QAction* action2 = new QAction("保存");menu->addAction(action1);menu->addAction(action2);// 4.设置一个输入框,设置字体大小、将输入框显示到控件中心edit = new QPlainTextEdit;QFont font;font.setPointSize(20);edit->setFont(font);this->setCentralWidget(edit);// 5.连接 QAction 的信号槽connect(action1, &QAction::triggered, this, &MainWindow::handleAction1);connect(action2, &QAction::triggered, this, &MainWindow::handleAction2);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handleAction1()
{// 1.弹出“打开文件”对话框,让用户选择需要打开的文件QString filePath = QFileDialog::getOpenFileName();// 2.设置状态栏,将文件路径显示到状态栏中。QStatusBar* statusBar = this->statusBar();statusBar->showMessage(filePath);// 3.根据选择的路径,构造一个QFile对象,并打开文件,如果打开文件失败需要在状态栏中显示QFile file(filePath);bool ret = file.open(QIODevice::ReadOnly);if(!ret){statusBar->showMessage(filePath + "打开失败");}// 4.读取文件QString text = file.readAll();// 5.关闭文件(注意不要忘记)file.close();// 6.读取到的内容设置到输入框中edit->setPlainText(text);
}void MainWindow::handleAction2()
{// 1.弹出“保存文件”对话框QString filePath = QFileDialog::getSaveFileName();// 2.设置状态栏,将文件路径显示到状态栏中。QStatusBar* statusBar = this->statusBar();statusBar->showMessage(filePath);// 3.根据选择的路径,构造一个QFile对象,并打开文件,如果打开文件失败需要在状态栏中显示QFile file(filePath);bool ret = file.open(QIODevice::WriteOnly);if(!ret){statusBar->showMessage(filePath + "打开失败");}// 4.写文件QString text = edit->toPlainText();file.write(text.toUtf8());// 5.关闭文件file.close();
}

文件和目录信息类

QFileInfo 是 Qt 提供的⼀个⽤于获取⽂件和⽬录信息的类,如获取⽂件名、⽂件⼤⼩、⽂件修改⽇期等。

QFileInfo类中提供了很多的⽅法,常⽤的有:

  • isDir() 检查该⽂件是否是⽬录;
  • isExecutable() 检查该⽂件是否是可执⾏⽂件;
  • fileName() 获得⽂件名;
  • completeBaseName() 获取完整的⽂件名;
  • suffix() 获取⽂件后缀名;
  • completeSuffix() 获取完整的⽂件后缀;
  • size() 获取⽂件⼤⼩;
  • isFile() 判断是否为⽂件;
  • fileTime() 获取⽂件创建时间、修改时间、最近访问时间等;

类似于这样的功能,在C/C++标准库中本来都是没有的,所以要想使用类似的功能往往要使用系统api

例子:查看文件的属性

(1)设置一个按钮

(2)编写点击按钮的槽函数

(3)执行程序


http://www.mrgr.cn/news/23480.html

相关文章:

  • 500以内蓝牙耳机最良心推荐,四款高人气机型深度测评!
  • 一、MyBatis框架
  • 【基础算法总结】二分查找
  • Pyecharts 保存 png 图片问题
  • 【Power Compiler手册】11.功耗优化
  • 干货|生成式人工智能大模型备案详细办理资料清单
  • Pichound 猎图谷歌插件功能概览
  • yolov5 自训练模型转 tensorrt 及测试
  • AIGC入门:Comfyui整合包,解压即用!
  • 爆肝300+小时,我开发了个网络安全宣传周之网络安全知识有奖竞答小程序
  • 【南京工业大学主办,JPCS出版】自动化、电气控制系统与设备
  • C# List定义和常用方法
  • Vue入门学习笔记-从入门到模版语法
  • 钢铁百科:NM360E抗拉强度、NM360E力学性能、NM360E应用场所
  • 独霸15大厂Offer!我在AI大模型风口一飞冲天!
  • Selenium WebDriver自动化测试(基础篇)--定位特殊元素的高级应用
  • Prompt Engineer: 使用Thought来提升LLM的回复能力
  • 互联网环境下CentOS7部署K8S
  • WebGIS二维基础,地图开发必修框架:Canvas
  • html+css网页设计 旅游 蜘蛛旅行社5个页面