「QT」文件类 之 QIODevice 输入输出设备类

news/2024/11/15 19:30:52/

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「QT」QT5程序设计
📚全部专栏
「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制开发
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明

目录

    • QIODevice类在Qt 5.15中的详细介绍
      • 一、引言
      • 二、使用范围
      • 三、类的头文件
      • 四、类的注意事项
      • 五、类的继承
      • 六、类的构造介绍
      • 七、公有函数介绍
      • 八、Static函数介绍
      • 九、运算符重载
      • 十、详细代码举例

QIODevice类在Qt 5.15中的详细介绍

一、引言

QIODevice类是Qt框架中一个非常重要的抽象基类,它提供了一个通用的接口来访问输入/输出设备(如文件、内存缓冲区、网络连接等)。QIODevice定义了读写数据的基本方法,而具体的设备类(如QFile、QBuffer、QTcpSocket等)则继承自QIODevice并实现这些方法以提供特定的功能。通过QIODevice,Qt应用程序能够以统一的方式处理各种输入/输出操作。

二、使用范围

QIODevice类本身是一个抽象类,通常不直接实例化。它的主要用途是作为一个基类,为其他具体的输入/输出设备类提供一个统一的接口。这些具体的设备类包括但不限于:

  • QFile:用于文件系统的文件读写。
  • QBuffer:用于内存缓冲区的读写。
  • QTcpSocketQUdpSocket:用于网络数据的读写。
  • QProcess:用于与操作系统进程进行通信。
  • QDataStreamQTextStream等:用于对数据进行格式化读写。

通过使用QIODevice及其子类,Qt应用程序可以方便地处理各种类型的数据流,无论是从本地文件系统、内存还是网络。

三、类的头文件

QIODevice类的头文件是<QIODevice>。在使用QIODevice类(或其子类)时,需要包含这个头文件。

#include <QIODevice>

四、类的注意事项

  1. 抽象性:QIODevice是一个抽象类,不能直接实例化。必须使用其子类来创建具体的输入/输出设备对象。

  2. 错误处理:在进行读写操作时,可能会遇到错误(如文件不存在、磁盘空间不足、网络中断等)。QIODevice提供了error()方法和errorString()方法来报告错误。

  3. 状态检查:在进行读写之前,最好检查设备的状态(如是否可读写、是否已打开等)。QIODevice提供了isOpen()isReadable()isWritable()等方法来检查设备的状态。

  4. 线程安全性:QIODevice及其子类通常不是线程安全的。如果在多线程环境中使用,需要采取适当的同步措施。

  5. 数据完整性:对于网络或文件传输等可能涉及大数据量的操作,需要特别注意数据的完整性和错误处理。

五、类的继承

QIODevice是一个抽象基类,许多具体的输入/输出设备类都继承自它。这些子类实现了QIODevice中定义的纯虚函数,以提供具体的读写功能。例如,QFile类实现了文件的打开、关闭、读写等操作;QTcpSocket类实现了TCP网络连接的建立、数据的发送和接收等操作。

六、类的构造介绍

由于QIODevice是一个抽象类,它本身没有构造函数。但是,它的子类会提供构造函数来创建具体的输入/输出设备对象。例如,QFile类有一个接受文件路径作为参数的构造函数;QTcpSocket类则通常通过调用connectToHost()方法来建立网络连接。

七、公有函数介绍

QIODevice类定义了一些关键的公有函数,这些函数在子类中被实现以提供具体的功能。以下是一些常用的公有函数:

  • bool open(OpenMode mode):以指定的模式打开设备。OpenMode是一个枚举类型,表示设备的打开模式(如只读、只写、读写等)。
  • bool close():关闭设备。关闭后的设备通常不能再进行读写操作。
  • bool isOpen() const:检查设备是否已打开。
  • bool isReadable() const:检查设备是否可读。
  • bool isWritable() const:检查设备是否可写。
  • qint64 read(char *data, qint64 maxlen):从设备中读取最多maxlen个字节的数据到data缓冲区中。返回实际读取的字节数。
  • qint64 write(const char *data, qint64 len):将len个字节的数据从data缓冲区写入设备中。返回实际写入的字节数。
  • qint64 pos() const:返回设备当前的位置(即读写指针的位置)。
  • bool seek(qint64 pos):将设备的读写指针移动到指定的位置pos
  • bool atEnd() const:检查设备是否已到达末尾。
  • QIODevice::OpenMode openMode() const:返回设备的打开模式。
  • QString errorString() const:返回描述最后一个错误的字符串。

八、Static函数介绍

QIODevice类没有定义静态函数。所有的函数都是实例函数,需要创建QIODevice(或其子类)对象后才能调用。

九、运算符重载

QIODevice类没有重载任何运算符。它的子类可能会根据需要重载运算符,但这与QIODevice本身无关。

十、详细代码举例

以下是一个使用QIODevice及其子类QFile的示例代码,用于演示如何打开一个文件、读取其内容、写入新内容并关闭文件。

#include <QCoreApplication>
#include <QIODevice>
#include <QFile>
#include <QTextStream>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);// 创建一个QFile对象,表示要操作的文件QFile file("example.txt");// 以读写模式打开文件if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {qDebug() << "Failed to open file:" << file.errorString();return -1;}// 使用QTextStream来读取和写入文件内容QTextStream in(&file);QTextStream out(&file);// 将文件指针移动到文件开头(如果需要的话)file.seek(0);// 读取文件内容QString content = in.readAll();qDebug() << "File content before writing:" << content;// 写入新内容到文件(这将覆盖文件开头的内容,但不会删除其他内容,除非显式地这样做)out << "This is some new content.\n";// 确保文件内容被写入磁盘(对于某些设备,如网络套接字,这可能不是必需的)file.flush();// 再次读取文件内容以查看更改(注意:这将从文件开头开始读取)file.seek(0);content = in.readAll();qDebug() << "File content after writing:" << content;// 关闭文件file.close();return 0;
}

在这个示例中,我们首先创建了一个QFile对象来表示要操作的文件。然后,我们以读写模式打开了文件,并使用QTextStream来读取和写入文件内容。注意,我们在写入新内容之前将文件指针移动到了文件开头,这意味着新内容将覆盖文件开头的内容。最后,我们关闭了文件。这个示例演示了如何使用QIODevice及其子类QFile来进行基本的文件读写操作。


在这里插入图片描述


http://www.ppmy.cn/news/1547264.html

相关文章

制作图片木马

图片文件通常有称作幻数的头字节&#xff0c;我们来看一下几种图片文件的幻数&#xff1a; &#xff08;注意&#xff01;下面是二进制而不是文本格式的数据&#xff09; 通过检查头几位字节&#xff0c;可以分辨是否是图片文件&#xff01; 通过检查头几位字节&#xff0c;可…

数据库基础(11) . SQL脚本

1.概述 SQL脚本 : 是由一系列SQL命令组成在一起执行以完成特定的任务。 SQL脚本通常用于执行批量操作&#xff0c;如创建数据库对象&#xff08;表、视图、存储过程等&#xff09;、插入数据、执行批处理更新等。 1.1.标识符命名 对象起名&#xff08;变量、常量、函数等&a…

llama factory lora 微调 qwen2.5 7B Instruct模型

项目背景 甲方提供一台三卡4080显卡 需要进行qwen2.5 7b Instruct模型进行微调。以下为整体设计。 要使用 LLaMA-Factory 对 Qwen2.5 7B Instruct模型 进行 LoRA&#xff08;Low-Rank Adapters&#xff09;微调&#xff0c;流程与之前提到的 Qwen2 7B Instruct 模型类似。LoRA …

《通过不对称双分类器差异最小化进行糖尿病视网膜病变分级的领域偏斜适应》|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Grade-Skewed Domain Adaptation via Asymmetric Bi-Classifier DiscrepancyMinimization for Diabetic Retinopathy Grading 《通过不对称双分类器差异最小化进行糖尿病视网膜病变分级的领域偏斜适应》 01 文献速递介绍 糖尿病视网膜病变&#xff08;DR&#…

PaoluGPT——窥视未知

上一题已经得到一个flag&#xff0c;还有一个flag 根据题目信息&#xff0c;说明还有一些聊天记录是没有公开的&#xff0c;另一个flag就在这些未公开的聊天记录中 下载题目附件看看&#xff0c;发现里面有个main.py&#xff1a; 可以看到有两条SQL查询语句&#xff0c;猜测应该…

在使用ipc通信时 ,在渲染进程的Vue + TypeScript 开发过程,给window对象添加属性并赋值时,发生报错解决方法

报错图片如下&#xff1a; 解决方案如下&#xff1a;&#xff08;在env.d.ts文件下声明&#xff0c;任何一个env.d.ts的文件都行&#xff09; // env.d.tsdeclare interface Window {getSource: any }// 这个是IPC预加载文件&#xff0c;暴露给window用的是getSource&#xff…

单片机中的BootLoader(重要的概念讲解)

文章目录 一、链接地址和执行地址1. 链接地址(Load Address)2. 执行地址(Execution Address)链接地址与执行地址的关系实际工作流程总结二、相对跳转和绝对跳转1. 相对跳转(Relative Jump)2. 绝对跳转(Absolute Jump)3. `BX` 和 `BL` 指令总结三、散列文件1. 散列文件的…

C++实现用户分组--学习

第一步实现&#xff1a;ETL的设计分三部分&#xff1a;数据抽取(Data Extraction)、数据的清洗转换(Data Transformation)、数据的加载(Data Loading). 构建一个数据容器类&#xff0c;其中包含转换后的MNIST手写数据。还实现了一个数据处理程序&#xff0c;该数据处理程序将提…