【嵌入式——QT】文件系统和文件读写

【嵌入式——QT】文件系统和文件读写

  • 文本文件读写
  • 二进制文件读写
  • 文件目录操作
    • QCoreApplication
    • QFile
    • QFileInfo
    • QDir
    • QTemporaryDir和QTemporaryFile
    • QFileSystemWatcher
  • 图示
  • 代码示例

文本文件读写

QT提供了两种读写纯文本文件的基本方法,一种是用QFile类的IODevice读写功能直接进行读写,另一种是利用QFile和QTextStream结合起来,用流(Stream)的方法进行文件读写。

二进制文件读写

除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件,每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出。

文件目录操作

Qt为文件和目录操作提供了一些类,利用这些类可以方便的实现一些操作.

QCoreApplication

用于提取应用程序路径,程序名等文件信息,是所有应用程序的基类。

  • applicationDirPath():返回应用程序启动路径;
  • applicationFilePath():返回应用程序的带有目录的完整文件名;
  • applicationName():返回应用程序名称,无路径无后缀;
  • libraryPaths():返回动态加载库文件时,应用程序搜索的目录列表;
  • organizationName():返回应用程序机构名;
  • setOrganizationName(const QString &orgName):设置应用程序机构名;
  • exit(int returnCode = 0):退出应用程序;

QFile

除了打开文件操作外,QFile还有复制文件,删除文件等功能。

  • copy(const QString &fileName, const QString &newName):复制文件;
  • rename(const QString &oldName, const QString &newName):重命名文件;
  • remove(const QString &fileName):删除一个文件;
  • exists(const QString &fileName):判断文件是否存在;
  • setPermissions(const QString &fileName, QFileDevice::Permissions permissions):设置文件权限;
  • permissions(const QString &fileName):返回文件的权限;

QFileInfo

用于提取文件的信息,包括路径,文件名,后缀等。

  • setFile(const QString &file):设置文件名;
  • absoluteFilePath() const:返回带有文件名的绝对路径;
  • absolutePath() const:返回绝对路径不带文件名;
  • baseName() const:返回文件基名;
  • fileName() const:返回去除路径的文件名;
  • filePath() const:返回包含路径的文件名;

QDir

用于提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件,文件重命名等操作。

QTemporaryDir和QTemporaryFile

用于创建临时目录和临时文件。

  • setAutoRemove(bool b):设置是否自动删除;
  • path() const:返回创建的临时目录名称;
  • remove():删除此临时目录机及其下面所有文件;

QFileSystemWatcher

文件和目录监听类,监听目录下文件的添加,删除等变化,监听文件修改变化。

  • addPath(const QString &path):添加一个监听的目录或文件;
  • addPaths(const QStringList &paths):添加需要监听的目录或文件列表;
  • directories() const:返回监听的目录列表;
  • files() const:返回监听的文件列表;
  • removePath(const QString &path):移除监听的目录或文件;
  • removePaths(const QStringList &paths):移除监听的目录或文件列表;

图示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码示例

TextFileDialog.h

#ifndef TEXTFILEDIALOG_H
#define TEXTFILEDIALOG_H

#include <QDialog>

namespace Ui
{
    class TextFileDialog;
}

class TextFileDialog : public QDialog
{
    Q_OBJECT

public:
    explicit TextFileDialog(QWidget* parent = nullptr);
    ~TextFileDialog();

private slots:
    void on_pushButtonFileOpen_clicked();

    void on_pushButtonFileSave_clicked();

    void on_pushButtonStreamOpen_clicked();

    void on_pushButtonStreamSave_clicked();

private:
    Ui::TextFileDialog* ui;
};

#endif // TEXTFILEDIALOG_H

TextFileDialog.cpp

#include "TextFileDialog.h"
#include "ui_TextFileDialog.h"
#include <QDir>
#include <QFileDialog>
#include <QTextStream>
TextFileDialog::TextFileDialog(QWidget* parent)
    : QDialog(parent)
    , ui(new Ui::TextFileDialog)
{
    ui->setupUi(this);
}

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

void TextFileDialog::on_pushButtonFileOpen_clicked()
{
    QString curPath = QDir::currentPath();
    QString fileName = QFileDialog::getOpenFileName(this, u8"打开一个文件", curPath);
    if(fileName.isEmpty()) {
        return;
    }
    //用IODevice方式打开文件
    QFile file(fileName);
    if(!file.exists()) {
        return;
    }
    /**
    ReadOnly 只读方式打开文件 用于载入文件
    WriteOnly 只写方式打开文件,用于保存文件
    ReadWrite 读写方式打开文件
    Append 以添加模式打开文件,新写入文件的数据添加到文件尾部
    Truncate 截取方式打开文件,文件原有的内容全部被删除
    Text 以文本方式打开文件,读取时"\n"被自动翻译为换行符,写入时字符串结束会自动翻译为系统平台的编码 如Windows下是"\r\n"
    **/
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        return;
    }
    ui->plainTextEdit->setPlainText(file.readAll());
    file.close();
}


void TextFileDialog::on_pushButtonFileSave_clicked()
{
    QString curPath = QDir::currentPath();
    QString fileName = QFileDialog::getSaveFileName(this, u8"保存一个文件", curPath);
    if(fileName.isEmpty()) {
        return;
    }
    //用IODevice方式保存文件
    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        return;
    }
    QString str = ui->plainTextEdit->toPlainText();
    QByteArray strBytes = str.toUtf8();
    file.write(strBytes, strBytes.length());
    file.close();
}


void TextFileDialog::on_pushButtonStreamOpen_clicked()
{
    QString curPath = QDir::currentPath();
    QString fileName = QFileDialog::getOpenFileName(this, u8"打开一个文件", curPath);
    if(fileName.isEmpty()) {
        return;
    }
    //用QTextStream打开文本文件
    QFile file(fileName);
    if(!file.exists()) {
        return;
    }
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        return;
    }
    //用文本流读取文件
    QTextStream stream(&file);
    //自动检测Unicode,才能显示汉字
    stream.setAutoDetectUnicode(true);
    //读取一行
    // stream.readLine();
    ui->plainTextEdit->setPlainText(stream.readAll());
    file.close();
}


void TextFileDialog::on_pushButtonStreamSave_clicked()
{
    QString curPath = QDir::currentPath();
    QString fileName = QFileDialog::getSaveFileName(this, u8"保存一个文件", curPath);
    if(fileName.isEmpty()) {
        return;
    }
    QFile file(fileName);
    if(!file.exists()) {
        return;
    }
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        return;
    }
    QTextStream stream(&file);
    stream.setAutoDetectUnicode(true);
    QString str = ui->plainTextEdit->toPlainText();
    //写入文本流
    stream<<str;
    file.close();
}


BinaryFileDialog.h

#ifndef BINARYFILEDIALOG_H
#define BINARYFILEDIALOG_H

#include <QDialog>

namespace Ui
{
    class BinaryFileDialog;
}

class BinaryFileDialog : public QDialog
{
    Q_OBJECT

public:
    explicit BinaryFileDialog(QWidget* parent = nullptr);
    ~BinaryFileDialog();

private slots:
    void on_saveStm_clicked();

    void on_readStm_clicked();

    void on_saveDat_clicked();

    void on_readDat_clicked();

private:
    Ui::BinaryFileDialog* ui;
};

#endif // BINARYFILEDIALOG_H

BinaryFileDialog.cpp

#include "BinaryFileDialog.h"
#include "ui_BinaryFileDialog.h"
#include <QMessageBox>
#include <QFile>
#include <QDir>
#include <QFileDialog>
#include <QDebug>
BinaryFileDialog::BinaryFileDialog(QWidget* parent)
    : QDialog(parent)
    , ui(new Ui::BinaryFileDialog)
{
    ui->setupUi(this);
}

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

void BinaryFileDialog::on_saveStm_clicked()
{
    QString curPath=QDir::currentPath();
    QString aFileName=QFileDialog::getSaveFileName(this, tr(u8"选择保存文件"), curPath,
                      u8"Qt预定义编码数据文件(*.stm)");
    if(aFileName.isEmpty()) {
        return;
    }
    QFile aFile(aFileName);  //以文件方式读出
    if(!(aFile.open(QIODevice::WriteOnly | QIODevice::Truncate))) {
        return;
    }
    QDataStream aStream(&aFile);
    aStream.setVersion(QDataStream::Qt_5_9); //设置版本号,写入和读取的版本号要兼容
    qint16  rowCount=6; //数据模型行数
    qint16  colCount=5; //数据模型列数
    aStream<<rowCount; //写入文件流,行数
    aStream<<colCount;//写入文件流,列数
    //获取表头文字
    for(int i = 0; i<colCount; i++) {
        QString str="demo"+QString::number(i);//获取表头文字
        aStream<<str; //字符串写入文件流,Qt预定义编码方式
    }
    //获取数据区的数据
    for(int i=0; i<rowCount; i++) {
        qint16 ceShen=1;//qint16类型
        aStream<<ceShen;// 写入文件流,qint16
        qreal chuiShen=1;//qreal 类型
        aStream<<chuiShen;//写入文件流, qreal
        qreal fangWei=1.0;
        aStream<<fangWei;//写入文件流, qreal
        qreal weiYi=2.0;
        aStream<<weiYi;//写入文件流, qreal
        QString zhiLiang="demo";
        aStream<<zhiLiang;// 写入文件流,字符串
        bool quYang=true; //true or false
        aStream<<quYang;// 写入文件流,bool型
    }
    aFile.close();
}


void BinaryFileDialog::on_readStm_clicked()
{
    QString curPath=QDir::currentPath();
    //调用打开文件对话框打开一个文件
    QString aFileName=QFileDialog::getOpenFileName(this, tr("打开一个文件"), curPath,
                      "流数据文件(*.stm)");
    if(aFileName.isEmpty()) {
        return;
    }
    QFile aFile(aFileName);  //以文件方式读出
    if(!(aFile.open(QIODevice::ReadOnly))) {
        return ;
    }
    QDataStream aStream(&aFile); //用文本流读取文件
    aStream.setVersion(QDataStream::Qt_5_9); //设置流文件版本号
    qint16  rowCount, colCount;
    aStream>>rowCount; //读取行数
    aStream>>colCount; //列数
    //获取表头文字
    QString str;
    for(int i=0; i<colCount; i++) {
        aStream>>str;    //读取表头字符串
    }
    //获取数据区文字,
    qint16  ceShen;
    qreal  chuiShen;
    qreal  fangWei;
    qreal  weiYi;
    QString  zhiLiang;
    bool    quYang;
    for(int i=0; i<rowCount; i++) {
        aStream>>ceShen;//读取测深, qint16
        aStream>>chuiShen;//垂深,qreal
        aStream>>fangWei;//方位,qreal
        aStream>>weiYi;//位移,qreal
        aStream>>zhiLiang;//固井质量,QString
        aStream>>quYang;//bool
    }
    aFile.close();
}


void BinaryFileDialog::on_saveDat_clicked()
{
    QString curPath=QDir::currentPath();
    //调用打开文件对话框选择一个文件
    QString aFileName=QFileDialog::getSaveFileName(this, tr(u8"选择保存文件"), curPath, u8"二进制数据文件(*.dat)");
    if(aFileName.isEmpty()) {
        return;
    }
    QFile aFile(aFileName);  //以文件方式读出
    if(!(aFile.open(QIODevice::WriteOnly))) {
        return ;
    }
    QDataStream aStream(&aFile); //用文本流读取文件
    aStream.setByteOrder(QDataStream::LittleEndian);//windows平台
    qint16  rowCount=6;
    qint16  colCount=5;
    aStream.writeRawData((char*)&rowCount, sizeof(qint16)); //写入文件流
    aStream.writeRawData((char*)&colCount, sizeof(qint16));//写入文件流
    //获取表头文字
    // QString str;
    QByteArray  btArray;
    for(int i=0; i<colCount; i++) {
        QString str="demo"; //获取表头文字
        btArray=str.toUtf8(); //转换为字符数组
        aStream.writeBytes(btArray, btArray.length()); //写入文件流,长度uint型,然后是字符串内容
    }
    //获取数据区文字
    qint8 yes=1, no=0; //分别代表逻辑值 true和false
    for(int i=0; i<rowCount; i++) {
        qint16 ceShen=1;//qint16类型
        aStream.writeRawData((char*)&ceShen, sizeof(qint16));//写入文件流
        qreal chuiShen=1;//qreal 类型
        aStream.writeRawData((char*)&chuiShen, sizeof(qreal));//写入文件流
        qreal fangWei=1.0;
        aStream.writeRawData((char*)&fangWei, sizeof(qreal));
        qreal weiYi=2.0;
        aStream.writeRawData((char*)&weiYi, sizeof(qreal));
        QString zhiLiang="demo";
        btArray=zhiLiang.toUtf8();
        aStream.writeBytes(btArray, btArray.length());
        bool quYang=true; //true or false
        if(quYang) {
            aStream.writeRawData((char*)&yes, sizeof(qint8));
        } else {
            aStream.writeRawData((char*)&no, sizeof(qint8));
        }
    }
    aFile.close();
}


void BinaryFileDialog::on_readDat_clicked()
{
    QString curPath=QDir::currentPath();
    //调用打开文件对话框选择一个文件
    QString aFileName=QFileDialog::getSaveFileName(this, tr(u8"选择打开文件"), curPath, u8"二进制数据文件(*.dat)");
    if(aFileName.isEmpty()) {
        return;
    }
    QFile aFile(aFileName);  //以文件方式读出
    if(!(aFile.open(QIODevice::ReadOnly))) {
        return  ;
    }
    QDataStream aStream(&aFile); //用文本流读取文件
    aStream.setByteOrder(QDataStream::LittleEndian);
    qint16  rowCount, colCount;
    aStream.readRawData((char*)&rowCount, sizeof(qint16));
    aStream.readRawData((char*)&colCount, sizeof(qint16));
    //获取表头文字,但是并不利用
    char* buf;
    uint strLen;  //也就是 quint32
    for(int i=0; i<colCount; i++) {
        aStream.readBytes(buf, strLen); //同时读取字符串长度,和字符串内容
        QString str=QString::fromLocal8Bit(buf, strLen); //可处理汉字
    }
    //获取数据区数据
    qint16  ceShen;
    qreal  chuiShen;
    qreal  fangWei;
    qreal  weiYi;
    QString  zhiLiang;
    qint8   quYang; //分别代表逻辑值 true和false
    for(int i=0; i<rowCount; i++) {
        aStream.readRawData((char*)&ceShen, sizeof(qint16));  //测深
        qDebug()<<"ceShen"<<ceShen;
        aStream.readRawData((char*)&chuiShen, sizeof(qreal));  //垂深
        qDebug()<<"chuiShen"<<ceShen;
        aStream.readRawData((char*)&fangWei, sizeof(qreal));  //方位
        qDebug()<<"fangWei"<<fangWei;
        aStream.readRawData((char*)&weiYi, sizeof(qreal));  //位移
        qDebug()<<"weiYi"<<weiYi;
        aStream.readBytes(buf, strLen); //固井质量
        zhiLiang=QString::fromLocal8Bit(buf, strLen);
        qDebug()<<"zhiLiang"<<zhiLiang;
        aStream.readRawData((char*)&quYang, sizeof(qint8));  //测井取样
        qDebug()<<"quYang"<<quYang;
    }
    aFile.close();
}

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

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

相关文章

java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM科研管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

VS Code搭建windows+远程Linux上Docker的开发环境

在本地windows桌面系统远程Linux上Docker搭建开发环境主要步骤如下&#xff1a; 一、安装vs code和插件 在windows系统上安装vs code&#xff0c;并安装好remote-ssh、dev-container插件&#xff0c;也可以直接安装Remote Development&#xff0c;他会默认把vs code远程的几种…

网络请求与数据解析

urllib是Python自带的标准库中用于网络请求的库 &#xff0c;无需安装&#xff0c;直接引用即可。通常用于爬虫开发、API&#xff08;应用程序编程接口&#xff09;数据获取和测试。 urllib库的几个模块&#xff1a; urllib.request :用于打开和读取URLurllib.error:包含提出…

大模型相关算法模型学习

对Transformer中Add&Norm层的理解-CSDN博客 GPT模型总结【模型结构及计算过程_详细说明】_gpt结构-CSDN博客 推荐30个以上比较好的中文nlp意图识别模型源码&#xff1f;-CSDN博客 Few-shot learning&#xff08;少样本学习&#xff09;入门 - 知乎 (zhihu.com) 零次学习…

程序人生 - 爬虫者,教育也!

作为一个站长&#xff0c;你是不是对爬虫不胜其烦&#xff1f;爬虫天天来爬&#xff0c;速度又快&#xff0c;频率又高&#xff0c;服务器的大量资源被白白浪费。 看这篇文章的你有福了&#xff0c;我们今天一起来报复一下爬虫&#xff0c;直接把爬虫的服务器给干死机。 本文有…

Linux常见指令总结

ls&#xff1a;显示当前目录下文件列表 常用的命令行参数&#xff1a; -l 显示更多的文件属性 -a 显示所有的文件/目录&#xff08;包括隐藏的&#xff09; -d 只显示目录 ps&#xff1a;参数可以叠加使用。 例如&#xff1a;ls -la 显示所有文件…

基于 Jenkins 搭建一套 CI/CD 系统

一、CI/CD环境介绍 本次要实现如下效果&#xff0c;开发人员完成功能开发并提交代码到gitlab仓库&#xff0c;jenkins自动完成拉取代码、编译构建、代码扫描&#xff08;sonarqube&#xff09;、打包&#xff0c;再自动化完成部署到Tomcat服务器提供访问。 环境准备三台Centos…

初窥机器学习

人工智能 近几年来&#xff0c;人工智能&#xff08;AI&#xff09;已成为家喻户晓的术语&#xff0c;我们在游戏、电影&#xff08;还记得J.A.R.V.I.S吗&#xff1f;&#xff09;和书籍中经常看到它的提及和描绘&#xff0c;但人工智能究竟是什么呢&#xff1f; 人工智能简单…

远程同声传译如何实现?哪里提供专业的远程同声传译?

远程同传声传译&#xff0c;即线上同传翻译&#xff0c;是指翻译员通过非现场的网络方式进行的同声传译(实时翻译)。远程同声传译的实现依赖于一系列先进的技术手段和高效的协作流程。这一服务模式的出现&#xff0c;不仅打破了传统同声传译的地域限制&#xff0c;还为全球范围…

2024上半年软考初级《程序员》报名考试全流程梳理

​2024年软考程序员考试报名时间节点&#xff1a; 报名时间&#xff1a;上半年3月18日到4月15日&#xff0c;下半年8月19日到9月15日&#xff08;各地区报名时间不同&#xff0c;具体日期见官方通告&#xff09; 准考证打印时间&#xff1a;上半年5月20日起&#xff0c;下半年…

HarmonyOS NEXT应用开发之使用AKI轻松实现跨语言调用

介绍 针对JS与C/C跨语言访问场景&#xff0c;NAPI使用比较繁琐。而AKI提供了极简语法糖使用方式&#xff0c;一行代码完成JS与C/C的无障碍跨语言互调&#xff0c;使用方便。本示例将介绍使用AKI编写C跨线程调用JS函数场景。通过调用C全局函数&#xff0c;创建子线程来调用JS函…

项目实战-tpshop商城项目

项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…

【国产】API接口管理平台的产品设计与搭建讲解

【国产接口管理平台】PhalApi Pro (π框架专业版) PhalApi Pro (发音&#xff1a;π框架专业版)&#xff0c;是一款国产企业级API接口管理平台&#xff0c;可以零代码、快速搭建API接口开发平台、接口开放平台、接口管理平台。基于PhalApi开源接口开发框架&#xff0c;通过低代…

可视化表单流程编辑器为啥好用?

想要提升办公率、提高数据资源的利用率&#xff0c;可以采用可视化表单流程编辑器的优势特点&#xff0c;实现心中愿望。伴随着社会的进步和发展&#xff0c;提质增效的办公效果一直都是很多职场办公团队的发展需求&#xff0c;作为低代码技术平台服务商&#xff0c;流辰信息团…

MySQL8.0安装教程+使用Navicat远程连接

MySQL8.0安装教程使用Navicat远程连接 版本&#xff1a;MySQL8.0.28 环境&#xff1a;Windows11 1.MySQL下载 进入官网https://www.mysql.com/进行下载&#xff1a; 2.安装MySQL 下载好后&#xff0c;点击运行程序开始安装&#xff0c;安装步骤如下&#xff1a; 以下步骤验…

MSigDB数据库 | 富集分析需要的基因集该去哪里找?如何选择适合自己数据的基因集?

富集分析可以说是我们的老帮手了&#xff01;进行富集分析&#xff0c;就不能不提基因集&#xff0c;那基因集我们该去哪里找呢&#xff1f;我们又该如何选择适合自己数据的基因集呢&#xff1f;咱们今天就来浅浅唠一唠&#xff01; 最常见的操作就是去MSigDB数据库找现成的基因…

2024-3-11-C++作业

1>试编程 要求&#xff1a; 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 源代码: #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串&#xff1a;"…

RESTful接口规范参考

介绍 REST&#xff08;Representational State Transfe&#xff09;&#xff0c;一种架构设计风格&#xff0c;而不是强制标准&#xff0c;主要用于客户端与服务端接口规范&#xff1b;在现代的软件开发中&#xff0c;RESTful API已经成为应用程序之间通信的重要桥梁&#xff…

淘宝扭蛋机小程序开发:惊喜与趣味,尽在一扭之间

随着移动互联网的快速发展&#xff0c;小程序作为一种轻量级、便捷的应用形式&#xff0c;受到了广大用户的青睐。为了满足淘宝用户对新鲜、有趣购物体验的需求&#xff0c;我们倾力打造了淘宝扭蛋机小程序&#xff0c;为用户带来全新的购物乐趣和惊喜体验。 淘宝扭蛋机小程序…

【JavaScript标准内置对象】Math的介绍。

简言 js与其他高级语言一样&#xff0c;也可以进行数学运算。 Math 是一个内置对象&#xff0c;它拥有一些数学常数属性和数学函数方法。Math 不是一个函数对象。 Math 用于 Number 类型。它不支持 BigInt。 Math 与其他全局对象不同的是&#xff0c;Math 不是一个构造器。Ma…