【QT】文件流操作(QTextStream/QDataStream)

文本流/数据流(二级制格式)

  • 文本流 (依赖平台,不同平台可能乱码)涉及文件编码
#include <QTextStream>

操作的都是基础数据类型:int float string

//Image Qpoint QRect就不可以操作

需要下面的

  • 数据流 (不依赖平台—二级制)不涉及文件编码,,
    怎么读进去,怎么读出来
#include <QDataStream>

不同的主机进行数据传传输,使用的就是数据流。

使用文件流操作必须注释#include

文件流操作基本和QFile相同

QTextStream

读文件(直接会当作一个字符串一次性读完)

//#include <QFile>

       QFile file(fileName);
       
        //指定打开方式  --有返回值
        bool isOk = file.open(QFile::ReadOnly);
        
        if(isOk == false)
        {
            QMessageBox::critical(this,"ERROR","File open Failed");
        }
        //读文件
        QTextStream stream(&file);//将I/O设备给流对象
        stream.setCodec("utf8");//设置读取方式为utf8
        QString array;
       
        //读取多行        
        while(stream.atEnd())//判断读到最后一行
        {          //按照本地文件格式去读
          array += stream.readLine();
        }
        //显示文本
        ui->textEdit->setText(array);

QT中的乱码很恶心,需要记住上面的操作

写文件

按照文本流的方式写,会将将两部分连在一起

在这里插入图片描述

//写
     QFile f("aaa.txt");
     f.open(QFile::WriteOnly);
     QTextStream txt(&f);
     //写文件
     txt<<QString("lalalla")<<123456;
     f.close();
     
//读
     QString buf1;
     f.open(QFile::ReadOnly);
     txt.setDevice(&f);
     txt>>buf1;//读操作符
     qDebug()<<buf1.toUtf8().data();

因此建议,读文件不要使用操作符的方式去读。最好使用readLine()/readAll()的方式读取

写的时候可以用上面方式去写

QDataStream

读(写的时候会把每一个数据分成一个小块,会给头部记录数据类型/长度)

!!!!!怎么写进去,怎么读出来!!!!

写 :如 1234 → pig → dog123

读 1234 pig dog 123

//#include <QFile>

     QFile f("aaa.txt");//文件对象(可以当作显示屏(I/O设备))
     f.open(QFile::WriteOnly);
     QDataStream txt(&f);   //写的时候会把每一个数据分成一个小块,会给头部记录数据类型/长度
     //写文件
     txt<<QString("lalalla")<<123456;  //运算符写入
     f.close();

     QString buf1;
     f.open(QFile::ReadOnly);
     txt.setDevice(&f);
     txt>>buf1;
     qDebug()<<buf1.toUtf8().data();

输出:lalala ,那123456去哪了?

在这里插入图片描述

给代码加上number 必须是int类型和下面的123456一一对应,读的时候两种类型必须对应

     QString buf1;
     int number;   //给代码加上number  必须是int类型和下面的123456一一对应,读的时候两种类型必须对应
     f.open(QFile::ReadOnly);
     txt.setDevice(&f);
     txt>>buf1>>number;
     qDebug()<<buf1.toUtf8().data()<<number;

在这里插入图片描述

由于数据流方式写入是二进制格式,因此直接打开文件时乱码的。

在这里插入图片描述

使用文本编辑器打开aaa.txt

在这里插入图片描述

QDataStream txt(&f); //对I/O设备进行操作,还可以对内存进行操作。

QByteArray :可以当作一个内存块

在这里插入图片描述

//对内存进行操作,即可操作可传输

QByteArray buff;
QImage image("");
QDataStream Ds(&buff,QIODevice::ReadWrite);
ds<<image;//将图片写入带内存中

完整代码

#include "widget.h"
#include "ui_widget.h"
//#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QPushButton>
#include <QTextCodec>
#include <QDebug>
#include <QTextStream>
#include <QDataStream>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

     connect(ui->selectFile,&QPushButton::clicked,this,[=](){
        QString fileName= QFileDialog::getOpenFileName(this,"openfile","");
        if(fileName.isEmpty() == true)
        {
            QMessageBox::warning(this,"warning","打开失败");
            return;
        }
        ui->lineEdit->setText(fileName);

        //创建对象
       //默认读取文件格式:utf8
        QFile file(fileName);

        //指定打开方式  --有返回值
        bool isOk = file.open(QFile::ReadOnly);

        if(isOk == false)
        {
            QMessageBox::critical(this,"ERROR","File open Failed");
        }

        //读文件
        QTextStream stream(&file);//将I/O设备给流对象
        stream.setCodec("UTF-8");//设置读取方式为utf8
        QString array;

        //读取多行
        while(false == stream.atEnd())//判断读到最后一行
        {
          array += stream.readLine();//按照本地文件格式去读
        }

                //显示文本框
       ui->textEdit->setText(array);

        //文件读写完成
//        char buf[55] = {"1111"};
//          file.write(buf,strlen(buf));
//          file.write(QString("llala").toUtf8());
//          file.write(buf);
//        //关闭文件
        file.close();

});

//     QFile f("aaa.txt");
//     f.open(QFile::WriteOnly);
//     QTextStream txt(&f);
//     //写文件
//     txt<<QString("lalalla")<<123456;
//     f.close();

//     QString buf1;
//     f.open(QFile::ReadOnly);
//     txt.setDevice(&f);
//     txt>>buf1;
//     qDebug()<<buf1.toUtf8().data();

     QFile f("aaa.txt");
     f.open(QFile::WriteOnly);
     QDataStream ds(&f); //对I/O设备进行操作,可以对内存进行嗯操作/
     //写文件
     ds<<QString("lalalla")<<123456;
     f.close();

     QString buf1;
     int number;
     f.open(QFile::ReadOnly);
     ds.setDevice(&f);
     ds>>buf1>>number;
     qDebug()<<buf1.toUtf8().data()<<number;
     
//     //对内存进行操作
//     QByteArray buff;
//     QImage image("");
//     QDataStream Ds(&buff,QIODevice::ReadWrite);
//     ds<<image;//将图片写入带内存中 
    
}

Widget::~Widget()
{
    delete ui;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【案例】蜂窝物联网联合金草生物打造金线莲“工厂”,让金线莲种植更简单

一、项目背景&#xff1a; 金线莲又名金线兰、金草、鸟人参&#xff0c;为兰科开唇兰属植物&#xff0c;是一种传统名贵中药材&#xff0c;对生长的环境要求极其苛刻。传统金线莲种植由于环境不可控&#xff0c;茎腐病、软腐病、猝倒病等病害频发&#xff0c;金线莲产业发展遇到…

使用npm版本管理工具解决npm 的EACCES permissions errors when installing packages globally错误

EACCES错误通常表示“权限被拒绝”&#xff0c;意味着您没有足够的权限来执行某个操作。在计算机领域&#xff0c;尤其是在文件系统和程序安装中&#xff0c;这个错误很常见。以下是可能导致EACCES错误的原因以及相应的解决方法&#xff1a; 文件系统权限&#xff1a;当您尝试…

2024年JavaScript前端框架维护者预测

来自Angular、Next.js、React和Solid的维护者和创建者分享了他们计划在2024年进行的改进 2024年的前端会是什么样子&#xff1f;自从我们打破了我们的水晶球&#xff0c;The New Stack与Angular&#xff0c;Next.js&#xff0c;React和Solid的创建者和维护者讨论了他们2024年的…

UVC 设备框架在 Linux 4.15 内核的演变

1. 概述 发现之前的uvc框架和现在的还是有一些差别的&#xff08;比如从videobuf 过渡到videobuf2&#xff09;&#xff0c;写个blog记录一下&#xff0c;方便以后查询&#xff0c;我的内核版本&#xff1a;Linux 4.15 UVC&#xff08;USB Video Class&#xff09;设备框架是…

ThingsBoard开源物联网平台介绍

1. Thingsboard 简介 ThingsBoard是一个基于Java的开源物联网平台&#xff0c;旨在实现物联网项目的快速开发、管理和扩展。它使用行业标准的物联网协议&#xff08;MQTT、CoAP和HTTP&#xff09;实现设备连接&#xff0c;并支持云和本地部署。ThingsBoard结合了可扩展性、容错…

混合云构建-VPN打通阿里云和Azure云

要在阿里云和Azure云之间通过VPN打通网络,您需要在两边分别设置VPN网关,并配置相应的连接和路由规则以确保两个云环境之间的网络流量可以互通。以下是一个基本的步骤指南: 为了更具体地说明如何在阿里云和Azure之间通过VPN打通网络,我们将通过一个简化的示例来演示整个过程…

【代码随想录 | 数组 05】螺旋矩阵 ||

文章目录 5.螺旋矩阵25.1题目5.2思路 5.螺旋矩阵2 5.1题目 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例一&#xff1a; 输入&#xff1a;n 3 输出&#xff…

全景解析 Partisia Blockchain:以用户为中心的全新数字经济网络

在区块链世界中&#xff0c;以比特币、以太坊网络为代表的主流区块链奠定了该领域早期的基础&#xff0c;并让去中心化、点对点、公开透明以及不可逆成为了该领域固有的意识形态。事实上&#xff0c;过于透明正在成为区块链规模性采用的一大障碍&#xff0c;我们看到 90% 以上的…

零知识玩转AVH(2)—— 怎么玩(1)

接前一篇文章&#xff1a;零知识玩转AVH&#xff08;1&#xff09;—— 初次接触 前一篇文章讲了AVH是什么&#xff0c;本文开始&#xff0c;详细AVH具体怎么玩。 由前一篇文章中提到的CSDN工作人员对于活动的说明&#xff0c;可以得出以下信息&#xff1a; 1. 这个任务是分两…

FineReport报表JS实现点击超链打开对话框报表并传参

例如在报表开发中&#xff0c;有如下需求&#xff1a; 点击当前报表中的某些文字&#xff0c;希望弹出另外的报表展示其他信息 &#xff08;即可以通过JS实现点击超链接打开报表对话框&#xff0c;并且可以传递参数到报表对话框中&#xff09;帆软帮助文档参考链接&#xff1a;…

AV1:编码块划分

​AV1是AOM于2018年发布的一代视频编码标准&#xff0c;相比于VP9其编码效率提升30%&#xff0c;相对于H.26X系列标准&#xff0c;AV1完全免去专利费可以自由使用。 AV1和其他视频编码标准类似&#xff0c;也采用基于块的编码架构。当编码器读进一帧图像&#xff0c;首先将其划…

签到提醒小工具:实时屏幕二维码检测+Server酱消息推送

前言 本文做了一个小工具&#xff0c;用来实时检测屏幕中出现的二维码&#xff0c;并通过Server酱发送信息推送到微信。 二维码检测 二维码检测主要通过opencv的detectAndDecode方法&#xff0c;基本用法如下&#xff1a; data, bbox, rectifiedImage detector.detectAndD…

【深度学习笔记】7_3 小批量随机梯度下降

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.3 小批量随机梯度下降 在每一次迭代中&#xff0c;梯度下降使用整个训练数据集来计算梯度&#xff0c;因此它有时也被称为批量梯度下…

折扣价和折扣实时转换

背景 : react 项目 问题 : 在折扣数中输入折扣2.333333&#xff0c;中间会多很多0&#xff0c;输入2.222&#xff0c;不能正常输入到第三位 如下图 原因 : toFixed()数字转字符串时可能会导致精度问题 解决思路 : parseFloat来解析浮点数,Number.isFinite判断给定的值是否为有…

es 查询案例分析

场景描述&#xff1a; 有这样一种场景&#xff0c;比如我们想搜索 title&#xff1a;Brown fox body&#xff1a;Brown fox 文章索引中有两条数据&#xff0c;兔子和狐狸两条数据 PUT /blogs/_bulk {"index": {"_id": 1}} {"title": "…

DayDreamInGIS 之 ArcGIS Pro二次开发 锐角检查

功能&#xff1a;检查图斑中所有的夹角&#xff0c;如果为锐角&#xff0c;在单独的标记图层中标记。生成的结果放在默认gdb中&#xff0c;以 图层名_锐角检查 的方式命名 大体实现方式&#xff1a;遍历图层中的所有要素&#xff08;多部件要素分别处理&#xff09;&#xff0…

【C语言】qsort函数的使用

1.使用qsort函数排序整型数据 #include <stdio.h> #include <string.h> #include <stdlib.h>//void qsort(void* base, //指针&#xff0c;指向的是待排序的数组的第一个元素 // size_t num, //是base指向的待排序数组的元素个数 // siz…

力扣每日一题 在受污染的二叉树中查找元素 哈希 DFS 二进制

Problem: 1261. 在受污染的二叉树中查找元素 思路 &#x1f468;‍&#x1f3eb; 灵神题解 &#x1f496; 二进制 时间复杂度&#xff1a;初始化为 O ( 1 ) O(1) O(1)&#xff1b;find 为 O ( m i n ( h , l o g 2 t a r g e t ) O(min(h,log_2target) O(min(h,log2​targ…

Django 学习笔记(Day1)

「写在前面」 本文为千锋教育 Django 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 Django 快速入门 1.1 Django 介绍 1.2 Django 安装 1.3 创建 Django 项目 1.4 运行 Django 项目 1.5 数据迁…

【C#】.net core 6.0 使用第三方日志插件Log4net,日志输出到控制台或者文本文档

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…