【Qt编程之Widgets模块】-007:QTextStream类及QDataStream类

news2024/11/16 12:49:18

1 概述

  • QTextStreamQDataStream都是对流进行操作

  • QTextStream只能普通类型的流操作像QChar、QString、int…,其实就很类似我们c或者c++中读写文件的感觉,

  • QDataStream就厉害了,无论是QTextStream的普通类型的流操作还是一些特殊类型的流操作它都可以办的到比如:QFontQPointQDate之类的几乎所有Qt中支持的所有类型都可以用QDataStream来进行操作。
    在这里插入图片描述

  • 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

1.1 QTextStream 类(文本流)

  • 字节顺序标记 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(即在文件的开头加上 0xEF BB BF 三个字节),比如 windows 的记事本等,因此在编辑 UTF-8 的文件时,需要注意该文件是否带有 BOM 的问题

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

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

  • QTextStream 在其内部使用 16 位(两字节)长的 QChar 类型存放每个字符,字符集使用Unicode,这与 C++的 iostream 不同,iostream 每个字符的类型由模板参数 charT 指定,标准库已将其特化为 char 和 wchar_t 类型,除此之外还可为 charT 指定其他类型,而QTextStream 的字符类型固定为 QChar 类型,使用此种方式简化了 Qt 流的总体结构,但也增加了字符占据的空间

1.2 QDataStream 类

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

Little-Endian(LE,小端):即低位字节存储在低地址端,高位字节存储在高地址端

Big-Endian(BE,大端):即高位字节存储在低地址端,低位字节储倣在高地址端。这是 QDataStream 的默认字节序。

  • 比如对于整数 0x2345,若按 big-endian(大端)顺序存储,则按 0x23、0x45 的顺序存储,若按 little-endian(小端)顺序存储,则以 0x45、0x23 的顺序存储

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

  • QDataStream 支持的 Qt 类型有 QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant 等类型,还包括容器类型,比如 QList、QVector、QSet、QMap 等

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

1.2.1 读写原始二进制数据

  • 可以使用int readRawData(char s, int len)将数据读入一个预先分配好的char; 缓冲区 s 必须被预先分配,缓冲区 s 使用 new[]分配,使用 delete 操作符销毁

  • 可以使用int writeRawData(const char *s, int len)函数把原始数据写入datastream 使用这种方式的话,要由你自己进行所有数据的编码和解码

int writeRawData(const char *s, int len);
  • 把 len 个字节的数据从缓冲区 s 写入流,并返回实际写入的字节数,若发生错误,则返回-1,注意:数据未编码
int readRawData(char *s, int len);
  • 从流中读取最多 len 个字节到缓冲区 s 中,并返回读取的字节数,若产生错误,则返回−1,缓冲区 s 必须被预先分配。数据是未编码的。

1.2.2 readBytes() 和 writeBytes()

QDataStream &QDataStream::writeBytes(const char *s, uint len)
  • 先写入一个quint32的数据,该值就是将要写入的数据的长度;紧接着写入相应数据
QDataStream &QDataStream::readBytes(char *&s, uint &l)
  • 先读取一个quint32值,该值就是将要读取的数据的长度,然后读取相应字节的数据到预先定义好的char*中 。

  • 注意,readBytes() 不需要我们事先分配好内存,仍然需要程序员自己进行编码和解码的

2 QTextStream示例代码

//
// 任务执行
virtual void exec()
{
    QFile file(m_filePath + "/" + "log.csv");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
    {
        return;
    }
    // 设置编码格式为 GB2312
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
    QTextStream dataStream(&file);
    dataStream << m_strHeader<< "\n";
    for (auto it:m_vecAllRecord)
    {
        dataStream << QString("%1,%2,%3,%4").arg(it.logTime).arg(it.strUserNumber).arg(it.strOperateType).arg(it.strDetailInfo) << "\n";
    }

    file.close();
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
}

3 QDataStream示例代码

	//写文件
    QFile file("test.bat");
    if(file.open(QIODevice::WriteOnly|QIODevice::Truncate)){
        QDataStream out(&file);
        int age=18;
        out<<QString("test")
           <<QDate::fromString("2023-05-10","yyyy-MM-dd")
           <<age;
        file.close();
    }else{
        file.errorString();
    }

    //读文件
    if(file.open(QIODevice::ReadOnly)){
        QDataStream in(&file);
        QString name;
        QDate birth;
        int age;
        in>>name>>birth>>age;
        qDebug()<<"姓名:"<<name
                <<"出生日期:"<<birth
                <<"年龄:"<<age;
    }else{
    	qDebug()<<file.errorString();
    }

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

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

相关文章

设计模式之【外观/门面模式】,不打开这扇门永远不知道门后有多少东西

文章目录 一、什么是外观模式&#xff08;门面模式&#xff09;1、外观模式的结构2、使用场景3、外观模式的优缺点4、外观模式注意事项 二、实例1、外观模式的通用写法2、智能家居案例3、积分换礼品案例 参考资料 一、什么是外观模式&#xff08;门面模式&#xff09; 外观模式…

yoloV5项目工程源码解读(2)(未完成)

概述 将主要从三个部分对源码进行解读。 数据层面&#xff0c;dataloader 和 数据增强网络模型&#xff0c;模型细节和逻辑模型训练&#xff0c;训练策略等 数据源解读 utils 中有&#xff0c;在train.py中能跳到该函数。 train.py中 # Trainloader 创建dataloader就是我们…

网络安全工程师辛苦吗?

“人生如寄&#xff0c;何事辛苦怨斜晖”&#xff0c;意思是人活着就像寄生在这个世界上&#xff0c;为什么一定要劳碌奔波&#xff0c;最后还抱怨人生苦短呢&#xff1f; 但说到辛苦二字&#xff0c;什么工作不辛苦呢&#xff1f;除了体制内的一些工作稍微轻松一些&#xff0c…

打家劫舍问题

题目&#xff1a; 打家劫舍https://leetcode.cn/problems/house-robber/ 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上…

重写Properties类,实现对properties文件的有序读写,数据追加,解决中文乱码

前言 *.properties文件&#xff0c;是 Java 支持的一种配置文件类型&#xff0c;并且 Java 提供了 properties 类来读取 properties 文件中的信息。文件中以键值对 "键值"的形式&#xff0c;存储工程中会多次重复使用的配置信息&#xff0c;通过“Properties”类来读…

【Mysql实战】使用存储过程和计算同比环比

背景 同环比&#xff0c;是基本的数据分析方法。在各类调研表中屡见不鲜&#xff0c;如果人工向前追溯统计数据&#xff0c;可想而知工作量是非常大的。 标题复制10行&#xff0c;并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比…

超全总结:硬件设计基础60条

硬件是一个非常复杂的系统&#xff0c;在设计过程中都会遇到或多或少的问题&#xff0c;本文中总结了非常基础的60个问题&#xff0c;供大家参考。 1、请说明一下滤波磁珠和滤波电感的区别。 磁珠由导线穿过铁氧体组成&#xff0c;直流电阻很小&#xff0c;在低频时阻抗也很小…

数字化转型,目的是为了转型还是数字化?

受第四次工业革命浪潮的影响&#xff0c;传统工业经济社会快速向数字经济转型过渡&#xff0c;企业创新面临的经济环境发生根本性变革。数字技术广泛应用于生产、交换、消费等经济环节&#xff0c;为企业产品创新、服务创新以及数字化开放式创新提供了动力源泉。数字经济背景下…

如何利用生产管理系统提高粉末治金工业的生产调度能力

在粉末冶金工业中&#xff0c;生产管理系统的应用已经成为了一个必不可少的部分。生产管理系统可以帮助企业实现自动化、信息化、智能化的生产&#xff0c;提高生产效率、降低生产成本、提高产品质量。生产管理系统可以对生产流程进行全面的监控和管理&#xff0c;从而实现生产…

11个超好用的SVG编辑工具

SVG的优势在于SVG图像可以更加灵活&#xff0c;自由收缩放大而不影响图片的质量&#xff0c;一个合适的SVG编辑工具能够让你的设计事半功倍&#xff0c;下面就一起来看看这些冷门软件好用在哪里。这11个超好用的SVG编辑工具依次为&#xff1a;即时设计、Justinmind、Sketsa SVG…

Sentinel-Dashboard-1.8持久化Nacos

Sentinel-Dashboard-1.8持久化Nacos 目录 Sentinel-Dashboard-1.8持久化Nacos一、客户端改造1.引入pom.xml文件依赖2.配置application.yml文件。 二、Sentinel-Dashboard源码改造三、测试 一、客户端改造 1.引入pom.xml文件依赖 <!-- https://mvnrepository.com/artifact/…

这些神奇的AI智能机器人很早就已出现过,你确定你不了解?

很多人自从ChatGPT出现以后&#xff0c;就总是担忧&#xff0c;担心自己的职业被影响&#xff0c;然后很多人大肆宣扬 ChatGPT 真是了不得&#xff0c;未来再辅助机器人&#xff0c;加上大数据&#xff0c;一定可以怎么怎么样&#xff0c;说的神乎其神&#xff0c;说实话&#…

几个pdf怎么合并在一起?

几个pdf怎么合并在一起&#xff1f;在日常生活和工作中&#xff0c;我们可能会遇到需要将多个PDF文件合并为一个文件的问题。在对PDF文件合并之后&#xff0c;能够更好地组织和管理信息。将pdf文件合并能够在很大程度上提高工作效率&#xff0c;减少查找和打开不同文件的时间。…

【计算机视觉 | ViT-G】谷歌大脑提出 ViT-G:缩放视觉 Transformer,高达 90.45% 准确率

文章目录 一、简介二、如何做到的&#xff1f;三、扩展数据四、「head」 的解耦权重衰减五、通过移除 [class] token 节省内存六、实验结果6.1 将计算、模型和数据一起扩展6.2 ViT-G/14 结果 论文地址为&#xff1a; https://arxiv.org/pdf/2106.04560.pdf一、简介 视觉 Trans…

PoseiSwap合规、隐私与支持更广泛的资产

Nautilus Chain 代表了公链赛道发展的一个新的范式形态&#xff0c;作为目前行业内首个 Layer3 链&#xff0c;是目前行业内第一个并行化且运行速度最快的EVM Rollup 方案。作为首个模块化链&#xff0c;存储、计算、共识等都在不同的模块中&#xff0c;意味着其能够获得更高的…

如何建立DDR3测试工程

要建立DDR3的测试工程&#xff0c;首先要生成mig IP核&#xff0c;然后写测试模块使用这个IP核进行测试。 一、生成 mig IP核 建立一个新工程&#xff0c;然后生成 mig IP核。 关键步骤如下&#xff1a; &#xff08;1&#xff09;点击 IP catalog&#xff0c;在搜索框输入…

SSM框架学习-AOP通知类型

在AOP中&#xff0c;通知&#xff08;Advice&#xff09;是对切点进行操作的方法&#xff0c;用于实现切面定义的具体逻辑。Spring框架支持五种类型的通知&#xff1a; 1. 前置通知&#xff08;Before advice&#xff09; 在连接点执行前&#xff0c;执行通知 Before("**…

【跟着陈七一起学C语言】今天总结:C语言的结构体和其它数据形式

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

OpenGL高级-立方体贴图

运行效果 源代码 着色器 渲染物体的顶点着色器&#xff1a; #version 330 core // 传入局部坐标下的顶点坐标 layout( location 0 ) in vec3 position; layout (location 1) in vec2 texCoords;// 传入变换矩阵 uniform mat4 model; uniform mat4 view; uniform mat4 proje…

d2l的一些理论知识的整理【1】

目录 考试知识整理引言2 预备知识2.1. 数据操作2.2. 数据预处理2.3. 线性代数2.4. 微积分2.5. 自动微分2.6. 概率2.7. 查阅文档 3 线性神经网络3.1. 线性回归3.2. 线性回归的从零开始实现3.3. 线性回归的简洁实现3.4. softmax回归3.5. 图像分类数据集3.6. softmax回归的从零开始…