QT中的文件操作QFile、QDataStream、QTextStream、QBuffer

文件操作概述

1、Qt中IO操作的处理方式

(1)、Qt通过统一的接口简化了文件与外部设备的操作方式

(2)、Qt中的文件被看做是一种特殊的外部设备

(3)、Qt中的文件操作与外部设备操作相同

2、IO操作中的关键函数接口

注意:IO操作的本质:连续存储空间的数据读写

3、Qt中IO设备类型

(1)、顺序存储设备:只能从头开始顺序读写数据,不能指定数据的读写位置(串口)

(2)、随机存储设备:可以定位到任意位置进行数据读写(seek function函数)(文件)

4、Qt中IO设备 的继承层次图

5、QT文件操作类型

QFile

QFile是Qt中用于文件操作的类

QFile直接支持文本文件:文件内容是可读的文本字符、

和数据文件:文件内容是直接的二进制数据的读写

QFineInfo用于读取文件属性信息
QTemPoraryFile安全创建全局唯一的临时文件、临时文件用于大数据传递或者进程间通信的场合
QTextStream

写入的数据全部转化为可读文本

QDataStream写入的数据根据类型转换为二进制
QBuffer

缓冲区的本质为一段连续的存储空间、QBuffer是qt中缓冲区相关的类

QDir是Qt中功能强大的目录操作类
QFileSystemWatcher用于监控文件和目录的状态变化(内容、重命名、删除)

QFile操作

 mainwindow.cpp:

#include "mainwindow.h"
#include <QApplication>

#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("qfile test");
    QWidget* w=new QWidget;
    setCentralWidget(w);

    buttonRead->setText("buttonRead");
    buttonWrite->setText("buttonWrite");
    QHBoxLayout* hlayout=new QHBoxLayout;
    hlayout->addStretch(1);
    hlayout->addWidget(buttonRead);
    hlayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding));
    hlayout->addWidget(buttonWrite);
    hlayout->addStretch(1);

    QVBoxLayout*container = new QVBoxLayout();
    container->addLayout(hlayout);
    container->addWidget(textEdit);
    centralWidget()->setLayout(container);
    this->resize(600, 400);

    connect(buttonRead,&QPushButton::clicked,this,&MainWindow::on_readData);
    connect(buttonWrite,&QPushButton::clicked,this,&MainWindow::on_writeData);
}

void MainWindow::on_readData()
{
    QString path = QFileDialog::getOpenFileName(this,"open", "../", "TXT(*.txt)");
    if(path.isEmpty() == false){
        QFile file(path); //文件对象
        bool isOk = file.open(QIODevice::ReadOnly);//打开文件,只读方式
        if(isOk == true) {
#if 0
            QByteArray array = file.readAll();//读文件,默认只识别utf8编码
            textEdit->setText(QString(array)); //显示到编辑区
            textEdit->setText(array);
#endif
            QByteArray array;
            while( file.atEnd() == false) {
                //读一行
                array += file.readLine();
            }
            textEdit->setText(array);
        }
        file.close();//关闭文件

        //获取文件信息
        QFileInfo info(path);
        qDebug() << "文件路径:"<< info.path();
        qDebug() << "文件名字:" << info.fileName().toUtf8().data();
        qDebug() << "文件后缀:" << info.suffix();
        qDebug() << "文件大小:" << info.size();
        qDebug() << "文件创建时间:" <<
        info.created().toString("yyyy-MM-dd hh:mm:ss");
        qDebug() << info.exists();
        qDebug() << info.isFile();
        qDebug() << info.isReadable();
        qDebug() << info.isWritable();
        qDebug() << info.lastRead();
        qDebug() << info.lastModified();//最后修改时间
    }
}

void MainWindow::on_writeData()
{
    QString path = QFileDialog::getSaveFileName(this, "save", "../", "TXT(*.txt)");
    if(path.isEmpty() == false) {
        QFile file; //创建文件对象
        file.setFileName(path);//关联文件名字
        bool isOk = file.open(QIODevice::WriteOnly);//打开文件,只写方式
        if(isOk == true) {

            QString str = textEdit->toPlainText();//获取编辑区内容
             file.write(str.toUtf8()); //QString -> QByteArray
             file.write(str.toStdString().data());//QString -> c++ string -> char *
            //file.write(str.toLocal8Bit());//转换为本地平台编码
        }
        file.close();
    }
}

 mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>
#include <QFormLayout>
#include <QTextCodec>
#include <QListWidget>
#include <QLabel>
#include <QStackedLayout>
#include <QTextEdit>
#include <QDebug>
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
#include <QDataStream>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:

    void on_readData();
    void on_writeData();
private:
    QPushButton *buttonRead = new QPushButton();
    QPushButton *buttonWrite = new QPushButton();
    QTextEdit *textEdit = new QTextEdit();
};

#endif // MAINWINDOW_H

 运行结果:

 

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

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

相关文章

基于协同过滤算法的图书推荐系统(ssm+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于协同过滤算法的图书推荐系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能需求…

C语言例1-11:语句 while(!a); 中的表达式 !a 可以替换为

A. a!1 B. a!0 C. a0 D. a1 答案&#xff1a;C while()成真才执行&#xff0c;所以!a1 &#xff0c;也就是 a0 原代码如下&#xff1a; #include<stdio.h> int main(void) {int a0;while(!a){a;printf("a\n");} return 0; } 结果如…

Soot入门学习笔记

Soot 适合参考的文档和教程如下&#xff1a; 北京大学软件分析技术 南京大学软件分析 Tutorials for soot McGill University 198:515 (vt.edu) 比较好的笔记资料&#xff1a; 南京大学《软件分析》课程笔记 比较好的入门作业或者案例&#xff1a; CSCE710 Assignmen…

vue3如何二次封装el-upload组件进行图片上传及删除

实现功能&#xff1a; 1、封装el-upload组件&#xff0c;父组件可以控制图片上传框的宽高 2、父组件可以传入提示信息&#xff0c;利用具名插槽 3、上传前的校验 4、实现删除功能 不同配置下的效果&#xff1a; 下边案例是图片上传的时候没有掉接口&#xff0c;在整体提交的时…

省级-能源结构数据(电力消费水平)(2000-2022年)

能源结构指能源总生产量或总消费量中各类一次能源、二次能源的构成及其比例关系。它是能源系统工程研究的重要内容&#xff0c;直接影响着国民经济各部门的最终用能方式&#xff0c;并反映了人民的生活水平。能源结构主要由生产结构和消费结构组成。 本数据通过电力消费水平来…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

Delphi 12 安卓 部署文件,不支持中文文件名

procedure TForm3.Button1Click(Sender: TObject); var sFileName:string; begin sFileName:TPath.Combine(TPath.GetDocumentsPath,禁止吸烟.wav); showmessage(sFileName); MediaPlayer1.Stop ; MediaPlayer1.FileName: sFileName; MediaPlayer1.Play; end;

Python之Opencv教程(3):人脸识别

1、人脸识别代码 直接上代码&#xff1a; import cv2# 加载训练数据集文件 recogizer cv2.face.LBPHFaceRecognizer_create()recogizer.read(trainer/trainer.yml)# 准备识别的图片 img cv2.imread(images/lisa.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face_dete…

Linux文件系统权限

文件的一般权限 每个文件针对每类访问者定义了三种主要权限&#xff1a; r&#xff1a;read 读 w&#xff1a;write 写 x&#xff1a;execute 执行 所属者/组/其他用户权限的字符表示二进制表示八进制表示---0000--x0011-w-0102-wx0113r--1004r-x1015rw-1106rwx1117 文件/目…

企业培训系统功能介绍

在当今知识经济时代&#xff0c;企业的竞争力在很大程度上取决于员工的专业能力和综合素质。为了适应不断变化的市场需求和技术进步&#xff0c;企业需要对员工进行持续有效的培训。一个高效的企业培训系统对企业人才培训至关重要。以下介绍一下企业培训系统的主要功能&#xf…

《操作系统导论》第15章读书笔记:机制:地址转换(address translation)

《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09; —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09;1.前…

c语言:用do-while输出前40项的斐波那契数值

求Fibonacci数列的前40个元素。该数列的特点是第1、2两个数为1、1。从第3个数开始&#xff0c;每数是其前两个数之和。 分析&#xff1a;从题意可以用如下等式来表示斐波那契数列&#xff1a; 1&#xff0c; 1&#xff0c; 2&#xff0c; 3&#xff0c; 5&#xff0c; 8&#x…

FA模型切换Stage模型组件切换之PageAbility切换

FA模型中PageAbility对应Stage模型中的UIAbility&#xff0c;PageAbility切换为UIAbility的方法如下。 在Stage应用中 创建UIAbility。 将FA应用中PageAbility的代码迁移到新创建的UIAbility中。 FA应用中PageAbility和Stage应用中的UIAbility生命周期基本一致&#xff0c;两者…

面试八股——redis——集群

0. redis集群的方案 1.主从复制&#xff08;高并发读&#xff09; 一个主节点负责写操作&#xff08;增删改&#xff09;&#xff0c;多个从节点负责查操作。 主从复制是让主节点修改数据之后&#xff0c;将对应数据同步到从节点中。 2.哨兵模式&#xff08;实现高可用&#x…

输出单链表倒数第K个结点值

方法一&#xff1a; 两次遍历链表。第一次遍历&#xff0c;计算链表长度&#xff0c;然后计算链表倒数第m个结点的正数位置k&#xff0c;判断位置是否合法&#xff0c;如果不合法&#xff0c;输出NOT FOUND&#xff0c;否则&#xff0c;进行第二次遍历链表&#xff0c;查找链表…

Cocos Creator 常见问题记录

目录 问题1、精灵图九宫格&#xff0c;角度不拉伸 问题2、BlockInputEvents 防止透屏 问题1、精灵图九宫格&#xff0c;角度不拉伸 点击编辑&#xff0c;拖拽到可变区域 问题2、BlockInputEvents 防止透屏

NFT-前端开发(一)

使用 在我们想要保存项目的目录下打开终端运行npx create-react-app test2命令初始化&#xff0c;test2是我们的项目名字&#xff0c;可以自己去更改。 初始化完成后&#xff0c;我们目录下就会多出一个test2文件夹 &#xff0c;然后我们在vscode中打开该文件夹 然后我们打开j…

Linux 基于chrony进行时钟同步方案验证

Linux 基于chrony进行时钟同步方案验证 1. 背景介绍2. 验证过程2.1 追踪配置2.2 追平记录2.2 追平时间换算 3. 疑问和思考3.1 如何统计追踪1s需要花费多长时间&#xff1f; 4. 参考文档 chrony是一个Linux系统中用于时钟同步的工具。它使用NTP&#xff08;网络时间协议&#xf…

HarmonyOS 应用开发之模型切换

本文介绍如何将一个FA模型开发的声明式范式应用切换到Stage模型&#xff0c;您需要完成如下动作&#xff1a; 工程切换&#xff1a;新建一个Stage模型的应用工程。 配置文件切换&#xff1a;config.json切换为app.json5和module.json5。 组件切换&#xff1a;PageAbility/Serv…

9.2-源码分析:Dubbo Remoting 层 Buffer 缓冲区

Buffer 是一种字节容器&#xff0c;在 Netty 等 NIO 框架中都有类似的设计&#xff0c;例如&#xff0c;Java NIO 中的ByteBuffer、Netty4 中的 ByteBuf。Dubbo 抽象出了 ChannelBuffer 接口对底层 NIO 框架中的 Buffer 设计进行统一&#xff0c;其子类如下图所示&#xff1a; …