Qt之Qfile读取文件操作

article/2025/8/23 15:21:08

文件系统:
  文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图(Qt5):
在这里插入图片描述
   QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
   QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
   QFlie:访问本地文件或者嵌入资源;
   QTemporaryFile:创建和访问本地文件系统的临时文件;
   QBuffer:读写QbyteArray, 内存文件;
   QProcess:运行外部程序,处理进程间通讯;
   QAbstractSocket:所有套接字类的父类;
   QTcpSocket:TCP协议网络数据传输;
   QUdpSocket:传输 UDP 报文;
   QSslSocket:使用 SSL/TLS 传输数据;

文件系统分类:
   顺序访问设备:
是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。
   随机访问设备:
可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针,QFile、QTemporaryFile和QBuffer是随机访问设备,

基本文件操作:
  文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。在所有的 I/O 设备中,文件 I/O 是最重要的部分之一。因为我们大多数的程序依旧需要首先访问本地文件(当然,在云计算大行其道的将来,这一观点可能改变)。QFile提供了从文件中读取和写入数据的能力。
我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改
  QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStreamQTextStream类来读写文件,也可以使用QIODevice类提供的read()、readLine()、readAll()以及write()这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取,而不是自己分析文件路径字符串。
**举个例子:**设计一个文本框,读写数据,保存在本地文件下
在这里插入图片描述
写文件:

void Widget::on_btn_write_clicked()
{QString path = QFileDialog::getSaveFileName(this,"write","../");if(path.isEmpty() == false){QFile file;            //创建对象file.setFileName(path);//打开文件,只写bool isok = file.open(QIODevice::WriteOnly);if(isok == true){//获取编辑区的内容QString str = ui->textEdit->toPlainText();//把读取到的文本写进文件file对象中//由于文件写函数是qbytearray类型的数据,所以需要在写之前将str转换成bytearray类型//在qt中有直接转换的函数,toutf8();file.write(str.toUtf8());}file.close();}
}

1:第一步是设置文件路径QFileDialog提供了一个对话框,允许用户选择文件或者目录,也允许用户遍历文件系统,用以选择一个或多个文件或者目录。
2:设置文本的名字或者路径
3:打开文本 ,file.open()和file.close()一起用。实际上qt中 文本在关闭时数据才会真正写如进去。你可以不写关闭函数 然后看看文件是否写进去的数据。我们在打开文本的时候,是可以选择打开的格式的,
在这里插入图片描述
枚举值 描述
QIODevice::NotOpen    未打开
QIODevice::ReadOnly    以只读方式打开
QIODevice::WriteOnly    以只写方式打开
QIODevice::ReadWrite    以读写方式打开
QIODevice::Append    以追加的方式打开,新增加的内容将被追加到文件末尾
QIODevice::Truncate    以重写的方式打开,在写入新的数据时会将原有 数据全部清除,                   游标设置在文件开头。
QIODevice::Text    在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格                   式,例如 Win32 平台上是 \r\n
QIODevice::Unbuffered    忽略缓存

读文件:

void Widget::on_btn_read_clicked()
{QString path = QFileDialog::getOpenFileName(this,"打开","../");if(path.isEmpty() == false){//创建文件对象QFile file(path);bool isok = file.open(QIODevice::ReadOnly); //只读模式打开if(isok == true){
#if 1//读文件QByteArray array =  file.readAll();//将数据写进文本框中ui->textEdit->setText(QString(array));
#else//一行一行的读QByteArray array;while(file.atEnd() == false){array += file.readLine();}ui->textEdit->setText(QString(array).toUtf8().data());#endif
}file.close();//获取文件信息QFileInfo info(path);qDebug()<<"文件名字:"<< info.fileName();qDebug()<<"文件后缀:"<< info.suffix();qDebug()<<"文件大小:"<< info.size();qDebug()<<"文件创建时间:"<< info.created().toString("yyyy-MM-dd hh:mm:ss"); //yyyy代表年 MMd}
}

读文件跟写文件差不多,这里我们主要说一下,如果我们需要文件的相关信息,比如路径,大小,格式等。并不是去索引这个文件路径然后获取相关信息。在qt中有一个QFileInfo的类,他有很多的函数 是用来获取文本信息的。例如:
 isDir()检查该文件是否是目录;
 isExecutable() 检查该文件是否是可执行文件等。
 baseName() 可以直接获得文件名;
 completeBaseName() 获取完整的文件名
 suffix() 则直接获取文件后缀名。
 completeSuffix() 获取完整的文件后缀

        //获取文件信息QFileInfo info(path);qDebug()<<"文件名字:"<< info.fileName();qDebug()<<"文件后缀:"<< info.suffix();qDebug()<<"文件大小:"<< info.size();qDebug()<<"文件创建时间:"<< info.created().toString("yyyy-MM-dd hh:mm:ss"); 

以上我们读写文件方式都是使用的QIODevice提供的函数,接下来我们看看怎么使用QDataStream二进制读写文件。
  QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
  QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。
二进制文件写操作:

    //创建文件 对象QFile file("../test.txt");bool isok = file.open(QIODevice::WriteOnly);if(isok == true){//创建数据流,和file文件关联起来,向数据流里面输入数据时,就是往文件里面写数据QDataStream stream(&file);   //stream 是二进制的数据,在文本显示为乱码stream << QString("主要看气质") << 250;file.close();}

二进制文件读操作:把写进去的数据读出来

    //创建文件 对象QFile file("../test.txt");bool isok = file.open(QIODevice::ReadOnly);if(isok == true){QDataStream stream(&file);//读取数据时 按照写入的顺序读取QString str;int a;stream >> str >>a ;cout << str.toUtf8().data() << a;}

在这里插入图片描述
  唯一需要注意的是,你必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃 就是我先写的qstring的值,然后再写的int值。我们在读取的时候也是先取出qstring的值 然后在读取int型的值。循序不能出错

  那么,既然QIODevice提供了read()、readLine()之类的函数,为什么还要有QDataStream呢?QDataStream同QIODevice有什么区别?区别在于,QDataStream提供流的形式,性能上一般比直接调用原始 API 更好一些。

文本文件读写

虽然QTextStream的写入内容与QDataStream一致,区别在于读取时不一致:

QDataStream中读取数据时,stream >> str >>a ; cout << str.toUtf8().data() << a;
QTextStream中读取数据时,stream >>str ; cout << str;
在这里插入图片描述
两者的输出结果都是一样的,可以看出在使用QTextStream的时候,不需要定义一个int的变量a来存储读出的int类型的数据250。这是因为当使用QDataStream写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而以文本形式写入数据,是没有数据之间的分隔的。


http://chatgpt.dhexx.cn/article/NIvT1y6Y.shtml

相关文章

常用性能测试工具的比较

目录 性能测试的重要性针对接口的性能测试 性能测试基准接口性能测试的主要指标abenchjMeterKelude性能脚本各种监控工具 参考总结 性能测试的重要性 众所周知性能测试在软件测试中占有举足轻重的作用&#xff0c;尤其是对于互联网产品这种具有大用户量&#xff0c;大数据量&a…

推荐几款常用的性能测试工具

“ 对内容不感兴趣拉到最后领取今天的外卖红包。” 常用的性能测试工具 对于开发人员来说&#xff0c;首选是一些开源免费的性能&#xff08;压力&#xff09;测试软件&#xff0c;例如 ab&#xff08;ApacheBench&#xff09;、JMeter 等&#xff1b;对于专业的测试团队来说&…

10款主流的软件测试工具,你用过吗?

随着软件快速交付需求的增长&#xff0c;越来越多的企业开始通过DevOps方法加速软件开发速度但这样的话&#xff0c;有时候就无法保证质量&#xff0c;所以今天小编就来给大家介绍10款主流的软件测试工具&#xff0c;供大家参考。 1、UFT / QTP UFT&#xff0c;前身为Quick …

10款好用的自动化测试工具

&#x1f4cc; 博客主页&#xff1a; 程序员二黑 &#x1f4cc; 专注于软件测试领域相关技术实践和思考&#xff0c;持续分享自动化软件测试开发干货知识&#xff01; &#x1f4cc; 如果你也想学习软件测试&#xff0c;文末卡片有我的交流群&#xff0c;加入我们&#xff0c;一…

常用的软件测试工具大全

开源测试管理工具&#xff1a;Bugfree、Bugzilla、TestLink、mantis 开源功能自动化测试工具&#xff1a;Watir、Selenium、MaxQ、WebInject 开源性能自动化测试工具&#xff1a;Jmeter、OpenSTA、DBMonster、TPTEST、Web Application Load Simulator **[TestDirector]&…

软件测试工作中有哪些常用的工具?

软件测试工作中有哪些常用的工具&#xff1f;一般来说有开源测试管理工具、开源功能自动化测试工具、开源性能自动化测试工具、Quality Center、QuickTest Professional、LoadRunner等。 一、推荐10款常见的软件测试工具: &#xff08;1&#xff09;Bugfree BugFree是借鉴微软的…

我们常用的软件测试工具有哪些?

一名优秀的软件测试工程师&#xff0c;我觉得他一定也是一名善用工具的好手&#xff0c;他知道在软件测试领域都有哪些测试工具&#xff0c;这些工具都有什么优缺点&#xff0c;这些工具适合在什么情况下使用 &#xff0c;反馈的结果是什么&#xff0c;知道各种工具之间如何配合…

测试工具类

目录 测试接口管理工具&#xff1a; Swagger Eolink APIKit Apipost7  Apifox 自动化测试平台&#xff1a; Choerodon猪齿鱼 MeterSphere RPA 自动化测试框架 Appium Robot Framework Selenium python 自动化测试框架 1.Robot Framework 2.Pytest 3.UnitTest…

软件测试工具有哪些(软件测试常用的工具都有哪些)

一、一个从事软件测试行业十年的老司机列出以下与软件测试相关的工具&#xff1a; 1.操作系统&#xff1a; Linux&#xff1a;vmware、xshell 、xftp 、ssh2.数据库&#xff1a; 主流是以下三种数据库&#xff0c;尤其是MySQL以及oralce,在测试中必会的技能是对表的相关操作&…

软件测试工具都有哪些

小编今天把软件测试常见的工具列了一下&#xff0c;看看有没有你现在在用的&#xff1f; 开源测试管理工具&#xff1a;Bugfree、Bugzilla、TestLink、mantis 开源功能自动化测试工具&#xff1a;Watir、Selenium、MaxQ、WebInject 开源性能自动化测试工具&#xff1a;Jmeter…

10大主流性能测试工具,总有一款适合你

市面上流行的压力/负载/性能测试工具多是来自国外&#xff0c;近年来国内的性能测试工具也如雨后春笋崛起。同时由于开发的目的和侧重点不同&#xff0c;其功能也有很大差异&#xff0c;下面就为您简单介绍10款目前最常见的测试产品。 01 kylinTOP测试与监控平台&#xff08;商…

10个常用的软件测试工具,你不容错过

在现代软件开发中&#xff0c;软件测试是不可或缺的一部分。为了确保软件产品的质量和稳定性&#xff0c;软件测试工具成为了测试团队的得力助手。 有许多优秀的软件测试工具可以帮助测试人员在各种测试活动中提高效率和准确性。 本文将介绍10个常用的软件测试工具&#xff0c;…

Android 实现锚点定位

相信做前端的都做过页面锚点定位的功能&#xff0c;通过<a href"#head"> 去设置页面内锚点定位跳转。 本篇文章就使用tablayout、scrollview来实现android锚点定位的功能。 效果图&#xff1a; 实现思路 1、监听scrollview滑动到的位置&#xff0c;tablayout切…

为什么定位不了HTML,css 锚点定位不了

css 锚点定位不了 css 锚点定位不了只有一个原因&#xff0c;就是书写错误&#xff0c;锚点的正确书写方式有两种&#xff0c;下面为各位介绍一下。 1、使用a标签设置锚点&#xff1a; ①&#xff1a;设置一个锚点链接 html&#xff1b;(注意&#xff1a;href属性的属性值最前面…

vue项目中实现锚点定位

使用场景&#xff1a;当页面被分割成许多小模块&#xff0c;且页面很长时&#xff0c;锚点功能可以帮助我们快速跳转到想要的模块&#xff1b;而当滑动滚动条时&#xff0c;根据当前视图中的显示的模块自动选中对应的锚点。 思路 锚点的id对应模块的元素的id。点击锚点时&#…

Vue3项目中锚点定位实现

代码 <!doctype html> <html class"no-js"><head><meta charset"utf-8"><title>锚点</title><script src"https://unpkg.com/vue3/dist/vue.global.js"></script><link rel"styleshee…

锚点定位——如何设置锚点居页面顶部距离,锚点定位并距离顶部一定偏移

锚点是网页制作中超级链接的一种&#xff0c;又叫命名锚记。命名锚记像一个迅速定位器一样是一种页面内的超级链接&#xff0c;运用相当普遍。 使用命名锚记可以在文档中设置标记&#xff0c;这些标记通常放在文档的特定主题处或顶部。然后可以创建到这些命名锚记的链接&#…

vue中实现锚点定位

vue中实现锚点定位 通过监听滚动事件&#xff0c;高亮显示锚点按钮添加点击事件&#xff0c;根据锚点滚动至对应区域并实现平滑滚动 这里主要是实现了一个简单的滚动触发锚点高亮&#xff0c;以及点击锚点触发滚动的功能 如果是获取浏览器的滚动高度&#xff0c;各个浏览器有所…

VUE实现锚点定位

文章目录 锚点定位功能总述提取标签内的关键词目录的渲染和点击跳转1.目录渲染2.锚点跳转 总结 锚点定位功能总述 在系统中会有管理端和客户端两种&#xff0c;在管理端中通过wangediter发布文章&#xff0c;然后在客户端中获取文章的数据&#xff0c;将其中h1和h2标签中的文字…

Vue锚点定位

VUE锚点定位 // 点击此处<div click"goDingyue">立即订阅</div>绑定事件 methods: {goDingyue() {// 获取元素在页面中的位置console.log(this.$refs.dingyue_box_ref.getBoundingClientRect());// document// .getElementById("agentTitle&qu…