文件系统和文件读写(初识)

news2024/11/18 3:44:50

1.文件读写 

1.QFileDialog提供了一个对话框,允许用户选择文件或者目录,也允许用户遍历文件系统,用以选择一个或多个文件或者目录。

2.QFileDialog继承了QDialog,具有父类的各种方法

3.Qt QFile文件操作
很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写、创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 WPS Office、PDFedit 等。为此,Qt 框架提供了 QFile 类专门用来操作文件。

QFile文件操作
QFile 类支持对文件进行读取、写入、删除、重命名、拷贝等操作,它既可以操作文件文件,也可以操作二进制文件

4.QFlieDialog  功能作用

1.最简单的获取方法(静态方法)
获取文件

QFileDialog::getOpenFileName()    //获取一个打开文件的文件名
QFileDialog::getOpenFileNames()   //获取多个打开文件的文件名
QFileDialog::getOpenFileUrl()     //获取一个打开文件的统一资源定位符
QFileDialog::getOpenFileUrls()    //获取多个打开文件的统一资源定位符
QFileDialog::getSaveFileName()    //获取保存的文件名
QFileDialog::getSaveFileUrl()     //获取保存的url

演示:

m_fileDialog->getOpenFileName(this,"选择cpp文件","./","ALL(*.*)、Images(*.png *.jpg)、CPP文件(*.cpp)");

 //static QString getOpenFileName(QWidget *parent = nullptr,
                                   const QString &caption = QString(),
                                   const QString &dir = QString(),
                                   const QString &filter = QString(),
                                   QString *selectedFilter = nullptr,
                                   Options options = Options());

QFile文件打开方式

打开方式                                含 义
QIODevice::ReadOnly      只能对文件进行读操作
QIODevice::WriteOnly     只能对文件进行写操作,如果目标文件不存在,会自行创建一个新文件。
QIODevice::ReadWrite     等价于 ReadOnly
QIODevice::Append       以追加模式打开文件,写入的数据会追加到文件的末尾(文件原有的内容保留)。
QIODevice::Truncate       以重写模式打开,写入的数据会将原有数据全部清除。注意,此打开方式不能单独使用,通常会和 ReadOnly 或 WriteOnly 搭配。
QIODevice::Text           读取文件时,会将行尾结束符(Unix 系统中是 “\n”,Windows 系统中是 “\r\n”)转换成‘\n’;将数据写入文件时,会将行尾结束符转换成本地格式,例如 Win32 平台上是‘\r\n’。

根据需要,可以为 mode 参数一次性指定多个值,值和值之间用|分割。

比如:

QIODevice::ReadOnly | QIODevice::Text:表示只允许对文件进行读操作,读取文件时,会将行尾结束符转换为 ‘\n’;

QIODevice::WriteOnly | QIODevice::Text:表示只允许对文件进行写操作,将数据写入文件时,会将行尾结束符转换为本地格式;

QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text:表示对文件进行写操作,写入的数据会存放到文件的尾部,同时数据中的行尾结束符转换为本地格式。

注意,传递给 mode 参数的多个值之间不能相互冲突,比如 Append 和 Truncate 不能同时使用。

如果文件成功打开,open() 函数返回 true,否则返回 false。

5.例如:

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    //打开文件  显示打开路径
    connect(ui->pushButton,&QPushButton::clicked,[&](){
       QString filename= QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\PC999");
       ui->lineEdit->setText(filename);

   //打开文件 读取文件中的内容
       QFile  file(filename);
       file.open(QIODevice::ReadOnly);
       //QByteArray array=file.readAll(); 一次读取全部的内容
       QByteArray array;
       while(!file.atEnd())
       {
           array+=file.readLine();//一行一行读取
       }
       ui->textEdit->setText(array);
       file.close();
     //写操作
       file.open(QIODevice::Append);
       file.write("I love you mom!");
       file.close();
    });
       
}

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

2.文件信息和文件定位操作

QFileInfo类为我们提供了系统有关的文件信息,包括文件的名字和在文件系统中位置,文件的访问权限,是否是目录或符合链接等等。并且,通过这个类,可以修改文件的大小和最后修改、读取时间。同时,QFileInfo类也可以用来取到Qt 资源的相关信息。

QFileInfo可以表示绝对路径或相对路径的文件。其中,绝对路径就是以"/"开始的路径(或者在Windows系统上就是以某个盘符开始的路径)。相对路径就是相对于当前工作目录的一个文件或目录。我们在开发中可以使用该类的成员函数isRelative() 来判断一个QFileInfo表示的是一个相对路径还是一个绝对路径,也可以使用makeAbsolute()将一个相对路径转换为一个绝对路径。

可以使用exists() 函数判断一个文件是否存在,使用size()函数获取文件的大小。成员函数isFile()、isDir()、isSymLink() 可以判断文件的类型(普通文件、目录或是符号链接)。

文件信息查询

 //文件信息
    QFile file("C:\\Users\\PC999\\Mytext.txt");
    QFileInfo info(file);
    qDebug()<<"绝对路径"<<info.absoluteFilePath();
    qDebug()<<"文件名"<<info.fileName();
    qDebug()<<"后缀名"<<info.suffix();
    qDebug()<<"创建时间"<<info.created().toString("yyyy.MM.dd hh:mm:ss");
    qDebug()<<"文件大小"<<info.size();

文件定位操作

//打开文件读取文件当中一段内容
    file.open(QIODevice::ReadOnly);
    file.seek(0);//从开始位置读取
    QByteArray array=file.read(5);
    qDebug()<<"前五个字节是"<<array;
    file.seek(15);
    array=file.read(5);
    qDebug()<<"16-20个字节是"<<array;
     file.close();

结果:

3.目录操作  文件系统监视器

QDir是进行目录操作的类,创建QDir对象时传出一个目录字符串作为当前目录,然后QDir函数就可以针对当前目录或目录下的文件夹进行操作。

QFileSyetemWatcher 是对目录和文件进行监听的类,。把某些文件或目录添加到QFileSyetemWatcher对象的监听列表后,当目录下发生文件新建、删除等操作时回发射directoryChanged()信号,当监听的文件发生修改、重命名等操作时,回发射fileChanged()信号。

#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QDir  myDir("C:\\Users\\PC999");
    ui->listWidget->addItem(myDir.absolutePath());//显示文件的绝对路径
    ui->listWidget->addItems(myDir.entryList());//显示文件中的文件和文件夹
    //entryList   Returns a list of the names of all the files and directories in the directory

    myDir.setNameFilters(QStringList("*.cpp"));//设置过滤器,显示带有.cpp的文件
    ui->listWidget->addItems(myDir.entryList());

    //设置监视器,监视文件夹中的文件有没有被改动过
    myDir.mkdir("mydir"); //在当前路径创建一个新文件夹
    connect(&myWatchr,&QFileSystemWatcher::directoryChanged,this,&Widget::showMessage);//新文件夹目录发生了改变
    connect(&myWatchr,&QFileSystemWatcher::fileChanged,this,&Widget::showMessage);//当前文件夹目录发生了改变

    myWatchr.addPath("C:\\Users\\PC999\\mydir");//此目录下 mydir文件夹下是否有文件的增加和文件的删除  显示是目录下有没有发生改变
    myWatchr.addPath("C:\\Users\\PC999\\Mytext.txt");//Mytext.txt文件中内容的是否改变

}

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

void Widget::showMessage(const QString &path)
{
    if(path=="C:\\Users\\PC999\\mydir")
        ui->listWidget->addItem("C:\\Users\\PC999\\mydir 目录发生改变" );
    else
        ui->listWidget->addItem("C:\\Users\\PC999\\Mytext.txt 文件发生改变" );
}



结果:

mydir下添加

Mytext.txt下添加么me too!

添加后 提示目录和文本被改变

4.文本流和数据流

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

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

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 等类型的最小长度,未规定最大长度)

数据流写入和读取文件如下:

//数据流
    QFile file("C:\\Users\\PC999\\file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream data_stream(&file);
    data_stream<<QString("Hello world")<<(qint32)65;//向文件中写入一个文本和数字
    file.close();

    file.open(QIODevice::ReadOnly);
    QDataStream data_in_stream(&file);//读取写入的文本和数字

    QString str;
    qint32 n;
    data_in_stream >> str >> n;//数据流读取写入的文本和数字
    qDebug()<<"str is"<<str<<"n is"<<n;
    file.close();

 结果:

TextStream 类(文本流)

字节顺序标记 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 流的总体结构,但也增加了字符占据的空间

文本流读取文件如下:

 //打开文件 读取文件中的内容
       QFile  file(filename);
       file.open(QIODevice::ReadOnly);
       QTextStream stream(&file);//创建文本流
       stream.setCodec("utf-8"); //有中文是会出现乱码,使用setCodec解决

       QByteArray array;
       while(!stream.atEnd())// while(!file.atEnd())
       {
           array+=stream.readLine();//一行一行读取
       }
       ui->textEdit->setText(array);
       file.close();

解决乱码后:

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

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

相关文章

centos7下 编译coreboot生成真机可用的bios固件, 并在真机上演示 (上篇)

看了国内的corebot相关文章以及b站的corebot视频, 大不部分都是编译 用于虚拟机(qemu)或者模拟器上运行的 很少有编译corebot项目 出可以再真机上使用的的 bios 本教程应该是全网最详细的了, 真机版的coreboot bios固件, 所以有点长, 希望对你有帮助 #coreboot编译总说明文档…

寒冬之下,互联网金融的数据化建设心得

引言&#xff1a; 在当前经济寒冬下&#xff0c;互联网金融行业面临着巨大的竞争压力和市场变化。为了保持竞争优势&#xff0c;不断创新和适应市场需求&#xff0c;互联网金融企业需要进行数据化建设。 本文将从策略规划、数据采集与整合、数据挖掘与分析、风险控制等方面&a…

数学建模——确定性时间序列分析方法

介绍 将预测对象按照时间顺序排成一组序列&#xff0c;称为时间序列。从时间序列过去的变化规律&#xff0c;推断今后变化的可能性及变化趋势、变化规律&#xff0c;这就是时间序列预测法。 时间序列模型&#xff0c;其实也是一种回归模型。其基本原理是&#xff0c;一方面承认…

windows Vscode 连接 虚拟机,超详细,含免密免ip配置 以 linux 虚拟机为例

我们这里使用 ssh 进行连接&#xff0c;不了解 ssh 的也没关系&#xff0c;感兴趣的可以自己了解一下。 我的虚拟机是 Ubuntu20.04&#xff0c;如果出现与 Centos 不一样的操作可以自行替换。 &#xff08;应该不会有&#xff1f;&#xff1f;&#xff09; 一 . 登录虚拟机~&a…

植物转录因子研究策略及方法

植物转录因子研究 转录因子&#xff08;TF&#xff09;是一类具有特殊结构的蛋白质&#xff0c;也称为反式作用因子。通过与靶基因启动子区域的顺式作用元件特异性结合&#xff0c;行使调控基因表达的功能。典型的转录因子一般具有4个功能结构域&#xff1a;DNA结合区&#xf…

pyqt 划线标注工具,可用于车道线标注

目录 效果图: pyqt代码: opencv划线: 效果图: pyqt代码: import osfrom PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QPushButton, QLabel from PyQt5.QtGui import QPainter, QPen, QColor, QImage, QPixmap from PyQt5.QtCore import Qt, QPoint i…

ubuntu编写makefile编译c++程序

常见的编译工具 gcc/gvisual cclang 编译一个简单的程序 main.cpp #include <iostream>int main() {std::cout << "hello world" << std::endl;return 0; }gcc 编译 源文件&#xff08;.cpp&#xff09;编译生成目标文件&#xff08;.o&#xf…

Python 封装一个自己的队列,切片? 深度copy ? 线程安全?

文章大纲 简介,Python 中的几种队列queue.queue 和 collections.deque 的区别collections 双端队列 deque 的封装队列是否可以支持深度 copy ?线程安全 的 queue参考文献和学习路径简介,Python 中的几种队列 https://docs.python.org/3/library/queue.html queue.queue 和 …

探究美颜算法:直播实时美颜SDK的集成和定制

下文小编将于大家一同探讨美颜算法&#xff0c;主要是直播实时美颜SDK的集成和定制方向。 一、直播实时美颜SDK的作用 直播实时美颜SDK是一种软件开发工具包&#xff0c;为开发者提供了将美颜功能集成到他们的直播应用中的手段。它可以用于各种应用&#xff0c;包括视频聊天、…

【苍穹外卖 | 项目日记】第三天

前言&#xff1a; 今天状态不错&#xff0c;kuku就是写接口&#xff0c;很舒服 目录 前言&#xff1a; 今日完结任务&#xff1a; 今日收获&#xff1a; 杂项知识点&#xff1a; 总结&#xff1a; 今日完结任务&#xff1a; 实现了新增菜品接口实现了菜品分页查询接口实现…

MISC驱动

misc 的意思是混合的杂项的&#xff0c;所以misc 设备驱动也叫做杂项设备驱动。它的注册跟使用比较的简单&#xff0c;所以比较适用于功能简单的设备。正因为简单&#xff0c;所以它通常嵌套在 platform 总线驱动中&#xff0c;配合总线驱动达到更复杂&#xff0c;多功能的效果…

动态列的excel导出

动态列的excel导出 由于上次写的动态列的excel导入时挖下的坑。 上一篇在这里&#xff1a;动态列的excel导入 喝水不忘挖井人&#xff0c;至于乱挖井&#xff0c;咱们先不说好不好吧&#xff0c;万一砸到了花花草草也不好啊&#xff0c;所以说啊&#xff0c;挖坑就得用军工铲…

MySQL数据库技术笔记(4)

关系型数据库需要使用设计范式&#xff1a; 第一范式&#xff1a;遵从原子性&#xff0c;属性不可再分&#xff0c;数据库表的每一列都是不可分割的基本数据项&#xff0c;同一列中不能有多个值。 例如&#xff1a;需要创建一张地址表&#xff0c;存储地址信息。将地址信息划…

UE4和C++ 开发-UE4怎么删除C++类

1 关闭visual stdio&#xff0c;关闭UE4引擎。 2 打开你的项目文件夹。找到你要删除的.h,.cpp文件删除。 3、删除Binaries文件夹。 4 右击.uproiect文件&#xff0c;点击Generate Visual Studio project files. 5 双击.uproiect文件,忽略警告打开就看到已经删除了想要删除的C类…

区块链加密虚拟货币交易平台安全解决方案

区块链机密货币交易锁遭入侵&#xff0c;安全存在隐患。使用泰雷兹Protect server HSM加密机&#xff0c;多方位保护您的数据&#xff0c;并通过集中化管理&#xff0c;安全的存储密钥。 引文部分&#xff1a; 损失7000万美元!黑客入侵香港区块链加密货币交易所 2023年9月&…

Qt 窗口与部署应用程序发布包 day6

Qt 窗口与部署应用程序发布包 day6 QWidget QWidget是所有可视控件的基类&#xff0c;每个控件都是矩形按照Z轴顺序排序如果控件没有父控件&#xff0c;则称为窗口 设置exe窗口图标 在项目文件中新建一个文件夹Resource&#xff0c;来存放图标文件 第一种方法 用绝对路…

java过滤非中英文的特殊字符,四字节表情字符

过滤非中英文的特殊字符 /*** 过滤特殊字符* param str str* return String*/ public static String filterStr(String str) {if (StringUtils.isBlank(str)) {return str;}String regEx "[~!#$%^&*()|{}:;,\\[\\].<>/?~&#xff01;#&#xffe5;%……&…

源码部署lamt架构

源码部署lamt架构 lamt由apache&#xff0c;mysql&#xff0c;tomcat三者组成 文章目录 源码部署lamt架构1.准备工作1.1.配置yum源&#xff0c;关闭防火墙和selinux1.2.拉取相应源码包 2.安装apache3.安装mariadb4.安装tomcat 1.准备工作 1.1.配置yum源&#xff0c;关闭防火墙…

“Python+”集成技术高光谱遥感数据处理与机器学习深度应用

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。结合Python编程工具&#xff0c;专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xff0c;…

SpringBoot配置输出的日志文件

SpringBoot配置输出的日志文件 1、无需导入依赖&#xff0c;因为我们创建springboot时&#xff0c;导入的关于springboot的依赖中已经包含了。 2、我们在项目的resources 资源文件下创建logback.xml文件&#xff0c;文件内容如下 作用&#xff1a; 如果是开发时启动的项目&a…