Qt输入输出类使用总结

news2024/10/7 10:14:04

Qt输入输出类简介

在这里插入图片描述
QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下:

  • QTextStream 类用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象上,或进行相反的操作。
  • QDataStream 类用于对数据进行二进制格式的读/写操作,QDataStream 只可在QIODevice 或 QByteArray 上运行,因为 QString 只存放字符数据。

QIODevice 类是 Qt 中所有 I/O 设备的基础接口类(这是一个抽象类),也就是说 QIODevice及其子类描述的是 I/O 设备,该类为支持读/写数据块的设备提供了通用实现和抽象接口,比如 QFile、QBuffer、QTcpSocket 等。

QIODevice 把设备分为两类:随机存储设备和顺序存储设备

  • 随机存储设备:可定位到任意位置(使用 seek()函数),随机存储设备有 QFile,QTemporaryFile,QBuffer;
  • 顺序存储设备:不支持任意的位置存储,顺序存储设备有 QProcess、QTcpSocket、QUdpSocket 和 QSslSocket。

QTextCodec 类负责 Unicode 与各字符编码之间的转换

QProcess 类与进程相关,QTcpSocket、QUdpSocket 等类与网络数据传输有关

QBuffer 类为 QByteArray 提供了一个 QIODevice 接口,以允许使用 QIODevice 接口来访问 QByteArray。默认情况下,创建一个 QBuffer 时,会自动在内部创建一个 QByteArray缓冲区。

QIODevice::OpenModeFlag 枚举介绍如下:
在这里插入图片描述

QDataStream 类(数据流)

QDataStream 类(数据流)简介

QDataStream 类负责以二进制方式读/写程序中的对象,输入源和输出目样标可以是QIODevice、QByteArray 对象。

字节序:即多字节数据(即大于一个字节的数据)在内存中的存储顺序,有如下两种方式:

  • Little-Endian(LE,小端):即低位字节存储在低地址端,高位字节存储在高地址端;
  • Big-Endian(BE,大端):即高位字节存储在低地址端,低位字节储倣在高地址端。这是 QDataStream 的默认字节序。
    比如对于整数 0x2345,若按 big-endian(大端)顺序存储,则按 0x23、0x45 的顺序存储,若按 little-endian(小端)顺序存储,则以 0x45、0x23 的顺序存储。

对象的存储和传输:若直接把一个对象保存在文件(或其他地方)上是没有意义的,因为对象中通常包含指向其他对象的指针,指针所指对象在下次运行时其内存地址很可能并不相同,因此在保存对象时,保存本次运行时指针的值就毫无意义,对此,需要采取必要的手段来解决保存对象的问题。对象的传输同样会遇到这种问题(比如在客户端和服务端传递对象时,在进程间传递对象时),解决这一问题的方法就是序列化(serializable)或称为串行化。

序列化(serializable):是把对象状态转换为可保存或可传输的形式的过程,与其对应的是反序列化,序列化和反序列化保证了数据易于存储和传输。数据通常以二进制序列的形式进行传输,因此序列化通常是把对象转换为字节序列的过程,其相反过程称为反序列化。

QDataStream 是编码信息的二进制流,它完全独立于主机的操作系统、CPU 和字节序,比如由 Windows 编写的数据流可以由运行 Solaris 的 Sun SPARC 读取。还可使用数据流来读/写原始的未编码的二进制数据。

QDataStream 实现了基本的 C++数据类型的序列化,比如 char,short,int,char *等。更复杂的数据类型的序列化是通过分解原始单元来完成的。

数据流与 QIODevice 紧密合作,QIODevice 表示一个能读/写数据的 I/O 设备,其中 QFile是常见的 I/O 设备。

写入到数据流的每一项都是以预定义的二进制格式编写的,该格式根据写入项的类型而有所不同。

QDataStream 支持的 Qt 类型有 QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant 等类型,还包括容器类型,比如 QList、QVector、QSet、QMap 等,支持的 Qt类型的完整列表可参阅帮助文档 Serializing Qt Data Types。

对于整数,建议始终转换为 Qt 整数类型(比如 qint32 等)进入写入,并将其读入为相同的Qt整数类型,这样可以确保获取确定的大小的整数,以避免编译器和平台差异的影响(注:C++语法只规定了 int,short 等类型的最小长度,未规定最大长度)。

使用 QDataStream 读/写二进制数据的步骤如下(以读/写到 QFile 为例):

  • 使用 QDataStream 可方便的使用>>和<<运算符对数据进行读写操作。
  • 使用 QDataStream 读取文件步骤相对来说要多一些,需要如下步骤:
    1)创建一个 QFile 对象;
    2)再打开文件;
    3)然后还需要创建一个 QDataStream 对象并把 QFile 对象绑定到该对象上;
    4)然后才能使用>>和<<运算符进行读取操作。

QDataStream 类函数详解(目前使用频率低)

QTextStream 类(文本流)

QTextStream 类(文本流)简介

字符编码基础知识

怎样将字符转换为二进制形式进行存储,存在一个编码的问题,通常都需进行两次编码

字符集字符的第一次编码是将字符编码为与一个数值(如一个 10 进制整数)相对应,比如把字符 A 编码为 10 进制的 65,B 编码为 66 等。把每一个字符都编码为与一个数值对应就组成了一个字符集,比如常用的 ASCII 字符集Unicode 字符集GB2312 字符集等。

编码(或称为编码字符集):字符的第二次编码就是把第一次编码好的数值再编码为相应的二进制形式,这样计算机就能识别了,比如对于 Unicode 字符集有 3 种不同的二次编码方案,分别是 UTF-8(变长位),UTF-16(16 位)和 UTF-32(32 位),目前使用较多的是使用 UTF-8来存储的 Unicode 字符集。本文把第二次编码后的方案简称为编码,比如 UTF-8 编码,UTF-16 编码等。

字节顺序标记 BOM(Byte Order Mark):BOM 是出现在文本文件头部的一种用于标识文件格式的编码UTF-16 和 UTF-32 通常使用 BOM 来表示文本的字节序字节序对 UTF-8没有意义,因此 UTF-8 不需要使用 BOM 来表明字节序,但可使用 BOM 来表明其编码方式,通常使用 0xEF BB BF 来表明此文本是使用的 UTF-8 编码。UTF-8 不推荐使用无意义的 BOM,但很多程序在保存 UTF-8 编码的文件时仍然带有 BOM(即在文件的开头加上 0x EF BB BF 三个字节),比如 windows 的记事本等,因此在编辑 UTF-8 的文件时,需要注意该文件是否带有 BOM 的问题。

QString 和 QByteArray 简介:QString 存储一个 16 位的 QChar 字符串其中每个 QChar 对应一个 Unicode4.0 字符(即存储的字符含有16位),对于代码值超过65536的Unicode字符使用两个连续的QChar表示QByteArray 类用于存储原始字节和传统的 8 位以’\0’终止的字符串。Qt 内部大量使用了QString,因此通常应使用 QString,QByteArrayy 主要用于存储原始二进制数据

QTextStream 基本规则

二进制文件格式更紧凑,但它是机器语言,不易于人工阅读和编辑,为此可使用文本格式代替二进制格式

QTextStream 类用于对数据进行文本格式的读/写操作,可在 QString、QIODevice 或QByteArray 上运行,使用 QTextStream 可方便的读/写单词、行和数字,另外 QTextStream还对字段填充、对齐和数字格式提供了格式选项的提供支持。

QTextStream 与编码和字符集:

  • QTextStream 在其内部使用 16 位(两字节)长的 QChar 类型存放每个字符,字符集使用Unicode,这与 C++的 iostream 不同,iostream 每个字符的类型由模板参数 charT 指定,标准库已将其特化为 char 和 wchar_t 类型,除此之外还可为 charT 指定其他类型,而QTextStream 的字符类型固定为 QChar 类型,使用此种方式简化了 Qt 流的总体结构,但也增加了字符占据的空间。
  • QTextStream 能在 Unicode 编码与系统的本地编码或其他任意编码间进行转换,且明确的处理了因系统的不同而导致的不同的行尾符的问题(比如,在 Windows 上行尾符是"\r\n",在 UNIX 或 mac OS X 上是"\n"),行尾符还可在打开设备时指定QIODevice::Text 枚举来设置。
  • QTextStream 使用 QTextCodec 类来支持不同的字符集默认使用QTextCodec::codecForLocale()返回的本地编码进行读/写,也可使用 QTextStream::setCodec()函数来重新设置编码
  • QTextStream 支持自动 Unicode 的 BOM 检测,当启用此功能(默认)时,QTextStream将检测 UTF-16 或 UTF-32 的字节顺序标记 BOM(Byte Order Mark),并在读取时切换到适当的 UTF 编解码器。默认情况下,QTextStream 不编写 BOM,但是可以通过调用 setGenerateByteOrderMark(True)来启用 BOM。

QTextStream 有 3 种读取文本文件的方式,如下:

  • 调用 readLine()逐行读取数据,使用 readAll()一次读取整个文件
  • 一个单词接一个单词的读取,单词由空格分开,且可自动跳过前导空格通过在 QString、QByteArray 或 char*缓冲区上使用>>操作符来实现
  • 一个字符接一个字符的读取,通过在 QChar 或 char 类型上使用使用>>操作符来实现。可使用 skipWhiteSpace()来跳过空格

格式控制:

  • QTextStream 模仿了的控制符(也称为操作器),比如可使用 dec 等流控制符以 10 进制形式显示数字,另外还可使用 setIntegerBase()、setNumberFlags()等函数来设置格式。
  • 当从文本流中读取数字时,QTextStream 会自动检测数字的基数,比如,若数字以 0x开始,则将被假定为 16 进制形式,若以 1~9 开头,则被假定为 10 进制形式。还可使用 dec 等流控制符、setIntegerBase()函数来设置基数,从而停止自动检测。
  • QTextStream 还可以进行基本数字类型和字符串之间的转换。

写入文本数据比较容易,但读取就比较难了,比如:

out<<"AAA"<<"BBB" //把 AAA 和 BBB 写入流
in>>s1>>s2; //试图从流中读取 AAA 到 s1,BBB 到 s2,

若使用 QTextStream 不能获得这个结果,此时 s1=“AAABBB”,而 s2 什么也没有,若使用QDataStream 则能使 s1=“AAA”,s2=“BBB”,因为 QDataStream 在字符串数据前面保存了每个字符串的长度。

由于文本流使用缓冲区(用于存储中间数据,这减少了对设备的访问数量),所以不应该使用设备的相应函数直接读取,比如,若一个 QFile 直接使用 QFile::readLine()读取,而不是使用 QTextStream::reaLine(),那么文本流的内部位置会与文件的位置不同步。

QTextStream 类中的函数

对 QTextStream 流的操作函数

1)构造函数:
QTextStream();
QTextStream(QIODevice *device); //构造一个在设备 device 上运行的 QTextStream

QTextStream(FILE *fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
此函数用于在控制台进行输入输出。

QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
构造一个在字符串 string 上运行的 QTextStream,打开模式由 openMode 指定。

QTextStream(QByteArray *array, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
构造一个在 array 上运行的 QTextStream,在内部 array 会由 QBuffer 包装。

QTextStream(const QByteArray &array, QIODevice::OpenMode openMode = QIODevice::ReadOnly);
构造一个在 array 上运行的 QTextStream,无论 openMode 的值如何,array 都以只读方式访问。

2)void flush();
刷新等待写入设备的缓冲区数据,若 QTextStream 对字符串进行操作,则此函数什么也不做。如果调用此函数,QTextStream 会将写入缓冲区中的所有数据清空到设备中,并调用设备上的 flush()。该函数的作用其实就是刷新缓冲区

3)bool atEnd() const;
若没有更多的数据从QTextStream中读取(即到达流的末尾),则返回true,否则返回false。

4)void resetStatus(); //重置 QTextStream 的状态
Status status() const; //返回 QTextStream 的状态
void setStatus(Status status);
设置 QTextStream 的状态。直到调用 resetStatus()之前将忽略对 setStatus()的后续调用。Status 枚举见下表
在这里插入图片描述
5)QIODevice *device() const; //返回与 QTextStream 关联的当前设备,若未分配设备,则返回 0
void setDevice(QIODevice *device);
把当前设备设置为 device,若已分配了设备,则 QTextStream 在更换旧设备之前调用QTextStream::flush()。注意:此函数会把语言环境重置为默认语言环境,将编解码器重置为默认编解码器 QTextCodec::codecForLocale()

6)QString *string() const; //返回分配给 QTextStream 的 string,若未分配,则返回 0
void setString(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
使用打开模式 openMode 重新设置 QTextStream 的设备为 string,若设备已分配,则QTextStream 在更换旧设备之前调用 QTextStream::flush()

读取流中的数据及位置函数

1)QString read(qint64 maxlen); //从流中读取 maxlen 个字符,并将其作为 QString 返回。

2)QString readAll();
从流中读取全部内容,并将其作为 QString 返回,处理大型文件时应避免使用此函数,因为会消耗大量内存。

3)QString readLine(qint64 maxlen = 0);
从流中读取一行文本,并将其作为 QString 返回,允许的最大行长度为 maxlen,若流的长度超过 maxlen,则行将在 maxlen 之后被拆分,并以部分的形式返回。若 maxlen为 0,则行可以是任意长度。返回的行没有行尾字符(“\n"或”\r\n"),若流已到达文件末尾,则返回空的 QString。

4)bool readLineInto(QString *line, qint64 maxlen = 0); //qt5.5
从流中读取一行文本到 line,若 line 为 0,则不存储读取的行。允许的最大行长度为maxlen,若流的长度超过 maxlen&

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

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

相关文章

Mysql命令行客户端常用命令

Mysql命令行客户端常用命令 注意点 下面展示的 database_name、table_name、column1、column2、value1、value2 和 datatype在自己用的时候需要替换为实际的值 在敲命令的时候要注意&#xff0c;一定要在末尾加上分号 操作 安装好Mysql之后&#xff0c;搜索找到以下应用 打…

QQ沐个人引导页html源码

好看的QQ沐个人引导页html源码&#xff0c;鼠标移动滑出美丽的线条收缩特效&#xff0c;界面美观大气&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 …

PDF24 Creator v11.12.1软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; PDF24 Creator v11.12.1是一款免费、简便实用的多功能 PDF 工具。用户可通过直观拖放界面轻松组合、编辑和处理PDF文件。功能包括合并、分割、添加、…

Python筑基之旅-MySQL数据库(二)

目录 一、第三方库 1、mysql-connector-python 1-1、由来 1-2、优缺点 1-2-1、优点 1-2-1-1、官方支持 1-2-1-2、纯Python实现 1-2-1-3、全面支持 1-2-1-4、兼容性 1-2-1-5、易于使用 1-2-2、缺点 1-2-2-1、性能 1-2-2-2、安装 1-2-2-3、社区支持 1-2-2-4、扩…

Windows神级工具汇总

Windows神级工具汇总 文章目录 Windows神级工具汇总ConEmu&#xff08;Cmder&#xff09;TortoiseGitListary & everythingBeyond CompareDittof.luxTranclucentTBSyncToyMaximaTyporaKeePass 2VeraCryptTexLive & TeXstudio & MathpixmybaseSeafile8gadgetpack电脑…

基于RK3588的AI边缘计算网关设计

随着物联网和人工智能技术的飞速发展&#xff0c;边缘计算逐渐成为数据处理和分析的重要趋势。RK3588作为一款高性能的处理器&#xff0c;具备强大的计算能力和丰富的接口&#xff0c;为构建AI边缘计算网关提供了有力的支持。本文将介绍基于RK3588的AI边缘计算网关设计&#xf…

数据结构与算法-树-二分搜索树(二)

二叉树节点删除的几种情况 今天我们研究一下二叉搜索树(BST)的删除操作。删除操作对树来讲有些复杂&#xff0c;包含以下场景&#xff1a; 删除点是叶节点删除点非叶节点&#xff0c;只有左子树删除点非叶节点&#xff0c;只有右子树删除点非叶节点&#xff0c;既有左子树又有右…

面试-软件工程与设计模式相关,Spring简介

面试-软件工程与设计模式相关&#xff0c;Spring简介 1.编程思想1.1 面向过程编程1.2 面向对象编程1.2.1 面向对象编程三大特征 1.3 面向切面编程1.3.1 原理1.3.2 大白话&#xff1f;1.3.3 名词解释1.3.4 实现 2. 耦合与内聚2.1 耦合性2.2 内聚性 3. 设计模式3.1 设计模型七大原…

【排序算法】堆排序(Heapsort)

✨✨✨专栏&#xff1a;排序算法 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 ​编辑 前言&#xff1a; 一、堆排序&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#xff1a; 算法稳定性&#xff1a; 二、升序的实现&#xff1a;通过建大堆实…

《Effective Objective-C 2.0》读书笔记——接口与API设计

目录 第三章&#xff1a;接口与API设计第15条&#xff1a;用前缀避免命名空间冲突第16条&#xff1a;提供“全能初始化方法”第17条&#xff1a;实现description方法第18条&#xff1a;尽量使用不可变对象第19条&#xff1a;使用清晰而协调的命名方式第20条&#xff1a;为私有方…

中国真人认证的相亲交友恋爱平台有哪些?测评5款高质量婚恋脱单软件

不少朋友都表示自己的社交圈子过于狭窄&#xff0c;朋友也没几个&#xff0c;那今天就来聊聊我是通过何种平台找到对象的。我与男朋友是在网络上相识的&#xff0c;许多朋友同样也是通过网络来相亲。不过我们的成功&#xff0c;真的真的不能表明网络上全都是好人&#xff0c;各…

你不知道的C语言知识(第2期)

本期介绍&#x1f356; 主要介绍&#xff1a;C语言中一些大家熟知知识点中的盲区&#xff0c;这是第二期。 文章目录 1. 一维数组在内存中的存储方式2. sizeof计算数组元素的个数3. 二维数组3.1 概念3.2 二维数组在内存中的存储3.3 初始化省略行&#xff0c;但不能省略列 4. 变…

【Python】 去除字符串中的所有空白字符

基本原理 在Python中&#xff0c;字符串&#xff08;String&#xff09;是不可变的数据类型&#xff0c;这意味着一旦创建了一个字符串&#xff0c;就不能修改它的内容。然而&#xff0c;我们可以创建一个新的字符串&#xff0c;它包含原始字符串中的字符&#xff0c;但不包含…

入门四认识HTML

一、HTML介绍 1、Web前端三大核心技术 HTML&#xff1a;负责网页的架构 CSS&#xff1a;负责网页的样式、美化 JS&#xff1a;负责网页的行动 2、什么是HTML HTML是用来描述网页的一种语言。 3、Html标签 单标签<html> 双标签<h>内容</h> 4、标…

Visual Studio 下的Qt工程无法打开 “xxx.ui“ 文件和LNK1104 无法打开文件“Qt5Cored.lib”错误

一、问题&#xff1a; VS下Qt环境准备好后&#xff0c;创建了Qt工程然后点击 Form Files 下的 “xxx.ui” 文件&#xff0c;在弹出 Qt 设计师 界面后闪退并显示如下错误&#xff1a; 二、解决 1、工具栏处依次点击&#xff1a;扩展 一> Qt VS Tools 一> options 弹出选…

在windows下dat文件转mat

环境配置 需要安装hdf5库&#xff0c;参考https://blog.csdn.net/qq_36314864/article/details/139168631 代码下载 https://download.csdn.net/download/qq_36314864/89349060 为了支持大文件的.dat文件转换&#xff0c;我们需要考虑如何处理大量数据以避免内存不足的问题…

利用kubeadm安装k8s集群 以及跟harbor私有仓库下载镜像

目录 环境准备 master&#xff08;2C/4G&#xff09; 192.168.88.3 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08;2C/2G&#xff09; 192.168.88.4 docker、kubeadm、kubelet、kubectl、flannel node02&#xff08;…

docker 安装 yapi

文章目录 docker 安装 yapi一、拉取镜像二、创建目录三、添加配置文件四、初始化数据库表五、启动 yapi六、测试以及修改默认密码 没有 MongDB 的可以先看这个教程&#xff1a;MongDB安装教程 docker 安装 yapi 版本&#xff1a; 1.9.5 一、拉取镜像 docker pull yapipro/y…

ClickHouse课件

列式存储数据库&#xff1a;hbase clickhouse 简介 ClickHouse入门 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用…

Python中文分词工具库之jieba使用详解

概要 在自然语言处理(NLP)领域,中文文本的分词是一个重要且基础的任务。Python的jieba库是一个广泛使用的中文分词工具,提供了丰富的功能,包括精准模式、全模式、搜索引擎模式等,适用于不同的应用场景。本文将详细介绍jieba库,包括其安装方法、主要特性、基本和高级功能…