QT五 文件系统,QFile,QfileInfo

 总览

  1. QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
  2. QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
  3. QFlie:访问本地文件或者嵌入资源;
  4. QTemporaryFile:创建和访问本地文件系统的临时文件;
  5. QBuffer:读写QbyteArray, 内存文件;
  6. QProcess:运行外部程序,处理进程间通讯;
  7. QAbstractSocket:所有套接字类的父类;
  8. QTcpSocket:TCP协议网络数据传输;
  9. QUdpSocket:传输 UDP 报文;
  10. QSslSocket:使用 SSL/TLS 传输数据;

文件系统分类:

        1. 顺序访问设备:

是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。

        2. 随机访问设备:

可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针,QFile、QTemporaryFile和QBuffer是随机访问设备,

核心 QFlie-基本文件操作

QFile提供了从文件中读取和写入数据的能力。

我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改

打开文件普通文件,关闭文件,读取文件

读取UTF-8格式的文件的三种方式

void MainWidget::on_openbutton_clicked()
{qDebug()<<"openclick";//通过dialogfile,让user选择一个txt文件。QFileDialog filedialog;QString openfilename = filedialog.getOpenFileName(this,"选择你要打开的文件","../","Text files (*.txt);;XML files (*.xml)");//如果user没有选择,则返回nullif(nullptr==openfilename){qDebug()<<"openfilename = null";return;}else{qDebug()<<openfilename.toUtf8().data();}//走到这里说明该文件的存在的,使用文件名 构建一个QFileQFile file(openfilename);char data[1024] = {0};int readlen = 0;bool openok = file.open(QIODevice::ReadOnly);if(false == openok){qDebug()<<"file open error";}else{qDebug()<<"file open success";//方式一,QFile提供了 readAll()函数,一次性读完//这里要读取的是utf-8的文本文件,如果不是utf-8格式,则显示的是乱码
//        QByteArray bytearr = file.readAll();
//        ui->textEdit->setText(bytearr);//方式二 按照C++的语法写。QFile read函数的返回值如下:如果读取到的值是0,说明读到文件末尾了,如果是-1说明有error发生,如果大于0,才是真的有数据
//        while((readlen = file.read(data,1024)) != 0){
//            if(readlen==-1){
//                ui->textEdit->setText("读取文件发生问题\n");
//                break;
//            }else if(readlen > 0 ){
//                ui->textEdit->append(data);
//            }
//        }//方式三。QByteArray ba ;while(!file.atEnd()){
//            qDebug()<<file.readLine(); readline 函数的内部实现是读完一行就继续下一行,知道结束,我们这里如果这样打log,那么再次调用readline就会读取下一行ba.append(file.readLine());}ui->textEdit->setText(ba);}file.close();}

读取其他文件格式的文件 -参见 QTextStream

存储文件

void MainWidget::on_savebutton_clicked()
{qDebug()<<"saveclick";QFileDialog filedialog;QString savefilename = filedialog.getSaveFileName(this,"save","../","Text files (*.txt)");if(savefilename.isEmpty() == false){qDebug()<<"保存的文件名为" <<savefilename;QFile file(savefilename);bool saveok = file.open(QIODevice::WriteOnly);if(saveok ==false){qDebug()<<"打开文件失败"<< file.fileName();return;} else {QString qs = this->ui->textEdit->toPlainText();file.write(qs.toUtf8());}file.close();}else{qDebug()<<"用户取消了保存";return;}}

使用 QDataStream 打开二进制文件 

注意的是,我们保存的是二进制的文件,即使名字是.txt,使用txt也是打不开的。

void MainWidget::savedata(){QFile qfile("../resource/009qfile/savedata.txt");bool wirteok = qfile.open(QIODevice::WriteOnly);if(wirteok==false){qDebug()<<"文件不存在";return;}else{qDebug()<<"savedata.txt存在";QDataStream datastream(&qfile);datastream<<QString("中国")<< 123567;}qfile.close();}

打开二进制文件

void MainWidget::readdata(){QFile qfile("../resource/009qfile/savedata.txt");bool readok = qfile.open(QIODevice::ReadOnly);if(readok==false){qDebug()<<"读取文件不存在";return;}else{qDebug()<<"读取文件savedata.txt存在";QDataStream datastream(&qfile);QString wenzi;int a;datastream>>wenzi >> a;qDebug()<<wenzi;qDebug()<<wenzi.toUtf8().data();qDebug()<<a;}qfile.close();
}

使用 QTextStream使用指定编码

这里要注意的是:你存储的时候用的什么编码,读取的时候也要用什么编码。

如果我们打开的文件不知道是什么编码,那是无法打开的。

void MainWidget::saveTextStream(){QFile qfile("../resource/009qfile/saveTextStream.txt");bool wirteok = qfile.open(QIODevice::WriteOnly);if(wirteok==false){qDebug()<<"saveTextStream.xt文件不存在";return;}else{qDebug()<<"saveTextStream.txt存在";QTextStream textstream(&qfile);textstream.setCodec("UTF-16");textstream<<QString("中国人zhongguo")<< 123567;}qfile.close();
}void MainWidget::readTextStream(){qDebug()<<"openclick";//通过dialogfile,让user选择一个txt文件。QFileDialog filedialog;QString openfilename = filedialog.getOpenFileName(this,"选择你要打开的文件","../","Text files (*.txt);;XML files (*.xml)");//如果user没有选择,则返回nullif(nullptr==openfilename){qDebug()<<"openfilename = null";return;}else{qDebug()<<openfilename.toUtf8().data();}//走到这里说明该文件的存在的,使用文件名 构建一个QFileQFile file(openfilename);bool openok = file.open(QIODevice::ReadOnly);if(false == openok){qDebug()<<"file open error";}else{//注意这里的读取方式qDebug()<<"file open success";QTextStream textstream(&file);textstream.setCodec("UTF-16");ui->textEdit->setText(textstream.readAll());}file.close();}

QFileInfo

有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取

    //走到这里说明该文件的存在的,使用文件名 构建一个QFileQFile file(openfilename);//值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过 QFileInfo 获取,而不是自己分析文件路径字符串。QFileInfo info(file);qDebug() << "info.isDir()" << info.isDir();//info 是不是路径qDebug() << "info.isSymLink()" << info.isSymLink();//如果此对象指向符号链接或快捷方式,则返回true;否则返回false。qDebug() << "info.isFile()" << info.isFile();// 是不是文件qDebug() << "info.isExecutable()" << info.isExecutable(); //是不是可执行文件,对于windows,指的应该就是exe文件qDebug() << "info.baseName()" << info.baseName(); //  QFileInfo fi("/tmp/archive.tar.gz"); QString base = fi.baseName();  // base = "archive"qDebug() << "info.completeBaseName() " << info.completeBaseName();//  QFileInfo fi("/tmp/archive.tar.gz"); QString base = fi.completeBaseName();  // base = "archive.tar"qDebug() << "info.suffix()" << info.suffix();qDebug() << "info.completeSuffix()" << info.completeSuffix();//和suffix的区别在   QFileInfo fi("/tmp/archive.tar.gz");QString ext = fi.completeSuffix();  // ext = "tar.gz"  //如果是suffix(),则结果是gzqDebug()<<fileinfo.created().time().hour();qDebug()<< fileinfo.created().toString("dd-MM-yyyy hh:mm:ss ap");//结果
//D:/code_qt/resource/009qfile/你好utf-8.txt
//info.isDir() false
//info.isSymLink() false
//info.isFile() true
//info.isExecutable() false
//info.baseName() "你好utf-8"
//info.completeBaseName()  "你好utf-8"
//info.suffix() "txt"
//info.completeSuffix() "txt"
//15
//"30-03-2025 03:04:14 下午"

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

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

相关文章

EF Core表达式树

文章目录 前言一、表达式树与委托的区别二、动态构建表达式树示例1示例2示例3高级技巧&#xff1a;表达式合并 三、ExpressionTreeToString安装方法基本用法支持的格式化风格 四、注意事项总结 前言 在 Entity Framework Core 中&#xff0c;表达式树&#xff08;Expression T…

NVM安装速通使用手册(Windows版)NVM管理node版本命令手册 NVM使用手册

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的命令行工具。通过nvm&#xff0c;你可以在同一台机器上安装和切换多个Node.js版本&#xff0c;非常适合开发和测试在不同Node.js版本上运行的应用程序 一、安装地址 1. 官方下载&#xff1a; &…

vLLM命令行使用方法详解

vLLM 是一个针对大语言模型(LLMs)优化的高效推理和服务库。以下是 vLLM 命令行工具的详细使用方法解析,涵盖常见场景和参数配置: 一、核心命令行工具 vLLM 提供两个主要的命令行入口: 启动 API 服务器 用于部署 HTTP/OpenAI 兼容的 API 服务: python -m vllm.entrypoint…

# 基于 OpenCV 的选择题自动批改系统实现

在教育领域&#xff0c;选择题的批改工作通常较为繁琐且重复性高。为了提高批改效率&#xff0c;我们可以利用计算机视觉技术&#xff0c;通过 OpenCV 实现选择题的自动批改。本文将详细介绍如何使用 Python 和 OpenCV 实现一个简单的选择题自动批改系统。 1. 项目背景 选择题…

python黑科技:无痛修改第三方库源码

需求不符合 很多时候&#xff0c;我们下载的 第三方库 是不会有需求不满足的情况&#xff0c;但也有极少的情况&#xff0c;第三方库 没有兼顾到需求&#xff0c;导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改&#xff0c;是我们将要遇到的一个难点…

第十三章:优化内存管理_《C++性能优化指南》_notes

优化内存管理 一、内存管理基础概念二、自定义分配器三、智能指针优化重点知识代码示例&#xff1a;智能指针性能对比 四、性能优化关键点总结多选题设计题答案与详解多选题答案设计题示例答案&#xff08;第1题&#xff09; 一、内存管理基础概念 重点知识 动态内存分配开销…

python笔记之函数

函数初探 python在要写出函数很简单&#xff0c;通过关键字def即可写出&#xff0c;简单示例如下 def add(a, b):return ab 以上即可以定义出一个简单的函数&#xff1a;接收两个变量a和b&#xff0c;返回a和b相加的结果&#xff0c;当然这么说也不全对&#xff0c;原因就是…

【服务器操作指南 - GPU 使用与文件传输】轻松掌握 GPU 状态查看和服务器文件传输技巧

0. 引言 在使用服务器时&#xff0c;高效管理 GPU 和文件传输是两项不可或缺的技能。 本指南旨在帮助您快速掌握服务器环境下的 GPU 使用状态监测方法&#xff0c;并简要介绍如何在服务器之间进行文件传输操作。 1. 查看服务器上的 gpu 使用状态 1.1 安装 gpustat 这条指令…

0330-YYYY-MM-DD格式日期比较大小

最简单的&#xff08;python&#xff09; from datetime import datetime def compare_time(time1,time2): time1_t datetime.strptime(time1,“%Y-%m-%d”) time2_t datetime.strptime(time2,“%Y-%m-%d”) if time1_t < time2_t: return time1_t elif time1_t > ti…

QFlightInstruments飞行仪表控件库

QFlightInstruments 是一个开源的飞行仪表控件库&#xff0c;专为基于 Qt 的应用程序设计。它提供了一系列仿真实飞机仪表的组件&#xff0c;适用于飞行模拟软件、航空电子系统或任何需要高仿真飞行仪表显示的项目。 主要功能 高仿真飞行仪表&#xff1a;包括空速表、高度表、…

VSCode 市场发现恶意扩展正在传播勒索软件!

在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店&#xff0c;但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld&#xff0c;目前已从商店中删除。 此外&#xff0c;ahban.cychelloworld 扩展于 2024 年 10 月…

国信华源携AI+水利创新成果亮相第十五届防汛抗旱信息化技术交流会

直击展会现场 近日&#xff0c;以“人工智能赋能防汛抗旱 融合创新共御极端灾害”为主题的第十五届防汛抗旱信息化技术交流会在河南郑州召开。作为水旱灾害防御领域的专精企业&#xff0c;北京国信华源科技有限公司携自主研发的入户叫应预警系统及覆盖防汛抗旱全链条的智慧化场…

MATLAB语言的链表反转

MATLAB语言的链表反转 链表是一种常见的数据结构&#xff0c;与数组相比&#xff0c;链表在插入和删除操作方面具有更高的灵活性。然而&#xff0c;链表的一些操作&#xff0c;比如反转链表&#xff0c;对一些初学者来说可能是一个挑战。本篇文章将重点讨论如何使用MATLAB语言…

Oracle数据库数据编程SQL<2.2 DDL 视图、序列>

目录 一、Oracle 视图(Views) &#xff08;一&#xff09; Oracle 视图特点 &#xff08;二&#xff09;Oracle 视图创建语法 关键参数&#xff1a; &#xff08;三&#xff09;Oracle 视图类型 1、普通视图 2、连接视图&#xff08;可更新&#xff09; 3、对象视图 4…

QtAdvancedStylesheets使用

QtAdvancedStylesheets 是一个基于 Qt Widgets 的样式表(QSS)增强库,允许开发者通过类似 CSS 的方式深度定制 Qt 应用程序的界面风格,支持动态主题切换、动画效果和复杂控件样式设计。 1. 核心功能 高级样式表支持 使用 CSS-like 语法美化 Qt Widgets(如 QPushButton、Q…

QtAV入门

QtAV 是一个基于 FFmpeg 和 Qt 的高性能多媒体播放框架,提供强大的音视频解码、渲染和处理能力,适合开发跨平台的播放器、视频编辑和流媒体应用。 1. 核心功能 多格式支持 支持 H.264/H.265、VP9、AV1 等视频编码。 支持 MP3、AAC、Opus 等音频编码。 封装格式:MP4、MKV、…

[ C++ ] | C++11 从左值引用到右值引用

&#xff08;目录占位&#xff09; 1. 前言&#xff1a; C 11 是在 C 98 之后又一个变化比较大的标准。为C增加了很多东西&#xff0c;其中有一部分是有用的&#xff0c;有一部分是我自认为作用不是很大东西。这一章呢&#xff1f;我们就来说说C11我&#xff0c;我认为对性能…

基于MCU实现的电机转速精确控制方案:软件设计与实现

本文将详细介绍一篇基于微控制器&#xff08;MCU&#xff09;的电机转速精确控制的软件方案。通过采样PWM信号控制和ADC采样技术&#xff0c;结合PID闭环控制算法&#xff0c;实现了电机转速的高效、稳定调节。以下是软件方案流程图&#xff0c;下文将对其进行展开讲解。 原图太…

Jmeter触发脚本备份

JMeter 在以下情况会触发脚本备份&#xff1a; 手动保存测试计划时&#xff1a;如果测试计划有未保存的修改&#xff0c;当用户手动保存测试计划&#xff08;脚本&#xff09;时&#xff0c;JMeter 都会自动将当前脚本备份到${JMETER_HOME}/backups文件夹下。 关闭 JMeter 时…

AI人工智能-PyCharm的介绍安装应用

下载与安装 创建python项目 项目路径&#xff1a;C:\Users\miloq\Desktop\python_project 配置环境 提前找到conda配置的python-base路径 配置conda环境 运行项目 运行结果