QT--文件操作和文件读写

文件操作和文件读写

  • QFile 类用于对文件进行操作,它继承自 QIODevice,可以进行读写操作。主要用于打开、关闭、读取、写入和管理文件。
1. 首先要指定文件路径
  1. QFile fn(“文件路径”);
  2. 也可以通过文件对话框来选择文件getOpenFileName
函数原型
QString QFileDialog::getOpenFileName(QWidget *parent = nullptr,const QString &caption = tr("Open File"),const QString &dir = QString(),const QString &filter = QString(),QString *selectedFilter = nullptr,QFileDialog::Option options = QFileDialog::Options()
);
代码举例
QString fn = QFileDialog::getOpenFileName(this,"openFile","/home/QFile","*.txt;;*.h *.c");
2. 指定文件打开权限,即打开之后能够操作什么
  1. 假设已经给fn指定好路径了,那么则有fn.open(权限)

  2. 文件打开权限

函数描述
QIODevice::NotOpen0x0000未打开模式。文件没有被打开。
QIODevice::ReadOnly0x0001只读模式。文件被打开以进行读取操作。
QIODevice::WriteOnly0x0002只写模式。文件被打开以进行写入操作。
QIODevice::ReadWrite0x0003读写模式。文件被打开以进行读取和写入操作。
QIODevice::Append0x0004追加模式。文件被打开以在末尾追加数据,不会覆盖原有内容。
QIODevice::Truncate0x0008截断模式。如果文件存在,将清空文件内容。
QIODevice::Text0x0010文本模式。以文本模式打开文件,行结束符会自动转换为系统特定的格式(例如\n 在Unix/Linux系统中,\r\n 在Windows系统中)。
QIODevice::Unbuffered0x0040无缓冲模式。禁用缓冲区,直接操作设备。
QIODevice::NewOnly0x0100仅在文件不存在时创建文件。如果文件已存在,操作将失败。
QIODevice::Existing0x0200仅在文件已存在时打开文件。如果文件不存在,操作将失败。
QIODevice::UnrestrictedRead0x0400允许未受限制的读取访问。可以用于某些情况下需要特别权限的读取操作。
3.对打开方式返回值判断
  1. 对open方式打开的文件都有一个布尔类型的返回值,成功为true,失败为false,可以借此判断是否以指定方式打开成功。
  2. 代码举例
bool ret = fn.open(QIODevice::ReadOnly);if(ret == false){ui->textEdit->setText("以只读方式打开失败");return;}
4. 文件的读和写
  1. 小知识
  • char buf[2024] = {0}; 这段代码的作用是创建一个长度为 2024的字符数组,并将数组中的每个字符元素初始化为 0,也就是空字符 ‘\0’。在C/C++中,字符串是以空字符 ‘\0’ 结束的字符序列。这样的初始化确保了数组在使用前不会包含任何未定义的值,非常适合用来存储字符串或者二进制数据。
    在这里插入图片描述
1.文件的读
  • 指定一个char类型的数组用来存储读的数据。可以指定较大的数组来一次性读取完所有的数据。也可以创建文本流的方式从文件中读取数据(灵活)。
    • 一次性
 char buf[20400] ={0};r = fn.read(buf,sizeof(buf));if(r<0){ui->textEdit->setText("读取失败");return;}ui->textEdit->setText(buf);
- 一行一行读
//需要包含QTextStream头文件
QTextStream fntext(&fn);fn是QFile类型,指定了文件的读取路径ui->textEdit->clear();while(!fntext.atEnd()){//fntext.atEnd():检查文件是否已经读取到末尾。QString line =fntext.readLine();ui->textEdit->append(line);}
2. 文件的写
  1. 有重新写入和追加写入两种方式,一般用的比较多的是追加写入
  2. 追加写入
    • 打开文件的方式是Append。文件写指针会自动定位到文件末尾,从而确保新写入的数据不会覆盖文件中已有的数据。
    • 获取写入的文本QString txtStr = ui->textEdit->toPlainText();
    • 将QString类型文本转换为std::string类型,也就是c++类型,因此可以使用C++标准库的字符串操作std::string str = txtStr.toStdString();
    • 因为write的参数是指针,长度。所以用c_str();获取c风格字符串指针,是常量指针喔。*const char pchar = str.c_str();
    • 为了保证QString 在转换为本地8位编码后正确地写入文件,处理可能存在的多字节字符。简单的说是因为文字的编码格式不一样,有utf-8,Gbk这种编码。采用toLocal8bit().length()能够获得一致的长度,从而避免字符截断或编码错误txtStr.toLocal8Bit().length()
    • write写入,fn.write(pchar,txtStr.toLocal8Bit().length());,它也有返回值。返回小于0的数表示写入失败。
void Widget::btnAppendClickedSlotFun()
{int r;QFile fn(ui->lineEdit->text());bool ret = fn.open(QIODevice::Append);if(ret == false){ui->textEdit->setText("追加写入失败");return;}QString txtStr = ui->textEdit->toPlainText();std::string str = txtStr.toStdString();const char *pchar = str.c_str();r = fn.write(pchar,txtStr.toLocal8Bit().length());if(r<0){ui->textEdit->setText("写入失败");return;}fn.close();
}
  1. 重新写入
    • 它和追加写入的方式只有打开文件的方式的不一样,也就导致文件写指针的位置不一样。
    • fn.open(QIODevice::WriteOnly|QIODevice::Truncate);//writeonly保证了文件以写的方式打开,truncate保证了文件当中有内容也被清空。
void Widget::btnWriteClickedSlotFun()
{int r;QFile fn(ui->lineEdit->text());bool ret = fn.open(QIODevice::WriteOnly|QIODevice::Truncate);if(ret==false){ui->textEdit->setText("打开写入失败");return;}QString txtStr = ui->textEdit->toPlainText();std::string stdstr = txtStr.toStdString();const char *pchar = stdstr.c_str();r = fn.write(pchar,txtStr.toLocal8Bit().length());if(r<0){ui->textEdit->setText("写入失败");return;}fn.close();
}
  1. 注意点
    • 当我们将文件给读取出来,并在文件内容上修改,一般采用重新写入。追加写入可以加日志之类的。
4. 文件的创建、关闭和删除
  1. 文件的创建,给fn一个不存在的文件路径名即可
void Widget::btnCreateClickedSlotFun()
{QFile fn(ui->lineEdit->text());fn.open(QIODevice::WriteOnly);//避免空文件打开时警告fn.close();
}
  1. 文件的关闭使用close函数即可。**fn.close();**读写完毕之后都要关闭
  2. 文件的删除使用remove函数即可。fn.remove();
5.整体代码
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
public slots:void btnOpenClickedSlotFun();void btnReadClickedSlotFun();void btnWriteClickedSlotFun();void btnAppendClickedSlotFun();void btnDeleteClickedSlotFun();void btnCreateClickedSlotFun();private:Ui::Widget *ui;
};
#endif // WIDGET_H//widget.h
#include "widget.h"
#include "ui_widget.h"
#include<QTextStream>
#include<QFileDialog>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setText("打开文件存放的路径");ui->btnOpen->setText("打开文件");connect(ui->btnOpen,SIGNAL(clicked()),this,SLOT(btnOpenClickedSlotFun()));ui->btnRead->setText("读取文件");connect(ui->btnRead,SIGNAL(clicked()),this,SLOT(btnReadClickedSlotFun()));ui->btnWrite->setText("写入文件");connect(ui->btnWrite,SIGNAL(clicked()),this,SLOT(btnWriteClickedSlotFun()));ui->btnAppend->setText("追加写入文件");connect(ui->btnAppend,SIGNAL(clicked()),this,SLOT(btnAppendClickedSlotFun()));ui->btnDelete->setText("删除文件");connect(ui->btnDelete,SIGNAL(clicked()),this,SLOT(btnDeleteClickedSlotFun()));ui->btnCreate->setText("创建文件");connect(ui->btnCreate,SIGNAL(clicked()),this,SLOT(btnCreateClickedSlotFun()));}Widget::~Widget()
{delete ui;
}void Widget::btnOpenClickedSlotFun()
{QString fn = QFileDialog::getOpenFileName(this,"openFile","/mnt/hgfs/linux_learn/QT_teacher_information/");if(fn.isEmpty()){ui->lineEdit->setText("选中目录失败,请重新选中");return ;}ui->lineEdit->setText(fn);
}void Widget::btnReadClickedSlotFun()
{int r;QFile fn(ui->lineEdit->text());bool ret = fn.open(QIODevice::ReadOnly);if(ret == false){ui->textEdit->setText("打开失败");return;}/*  char buf[20400] ={0};r = fn.read(buf,sizeof(buf));if(r<0){ui->textEdit->setText("读取失败");return;}ui->textEdit->setText(buf);*/QTextStream fntext(&fn);ui->textEdit->clear();while(!fntext.atEnd()){QString line =fntext.readLine();ui->textEdit->append(line);}fn.close();
}void Widget::btnWriteClickedSlotFun()
{int r;QFile fn(ui->lineEdit->text());bool ret = fn.open(QIODevice::WriteOnly|QIODevice::Truncate);if(ret==false){ui->textEdit->setText("打开写入失败");return;}QString txtStr = ui->textEdit->toPlainText();std::string stdstr = txtStr.toStdString();const char *pchar = stdstr.c_str();r = fn.write(pchar,txtStr.toLocal8Bit().length());if(r<0){ui->textEdit->setText("写入失败");return;}fn.close();
}void Widget::btnAppendClickedSlotFun()
{int r;QFile fn(ui->lineEdit->text());bool ret = fn.open(QIODevice::Append);if(ret == false){ui->textEdit->setText("追加写入失败");return;}QString txtStr = ui->textEdit->toPlainText();std::string str = txtStr.toStdString();const char *pchar = str.c_str();r = fn.write(pchar,txtStr.toLocal8Bit().length());if(r<0){ui->textEdit->setText("写入失败");return;}fn.close();
}void Widget::btnDeleteClickedSlotFun()
{QFile fn(ui->lineEdit->text());bool r = fn.remove();if(r==false){ui->textEdit->setText("删除失败");return;}else{ui->textEdit->setText("删除成功");}}void Widget::btnCreateClickedSlotFun()
{QFile fn(ui->lineEdit->text());fn.open(QIODevice::WriteOnly);//避免空文件打开时警告fn.close();
}
  • 布局
    在这里插入图片描述

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

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

相关文章

【大数据面试题】37 Doris 是怎么保证性能的?

一步一个脚印&#xff0c;一天一道大数据面试题 博主希望能够得到大家的点赞收藏支持&#xff01;非常感谢 点赞&#xff0c;收藏是情分&#xff0c;不点是本分。祝你身体健康&#xff0c;事事顺心&#xff01; Doris 是当下大热的 MPP 数据库&#xff0c;下面来聊聊它如何保证…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习…

【博主推荐】HTML5实现简洁的实用的个人网站、个人主页七个页面源码

文章目录 1.设计来源1.1 个人主页界面1.2 关于我界面1.3 我的技能界面1.4 我的经验界面1.5 我的教育界面1.6 我的项目界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;…

ipsec协议簇(详解)

IPSEC协议簇 IPSEC协议簇 --- 基于网络层的&#xff0c;应用密码学的安全通信协议组 IPV6中&#xff0c;IPSEC是要求强制使用的&#xff0c;但是&#xff0c;IPV4中作为可选项使用 IPSEC可以提供的安全服务 机密性 --- 数据加密 完整性 --- 防篡改可用性 数据源鉴别 -- 身份…

长效代理IP如何选用及代理服务分析

在这个数据为王、信息瞬息万变的时代&#xff0c;长效代理IP成为了众多开发者、数据科学家乃至普通网民手中的一把利器。它不仅能帮助我们解决地域管理&#xff0c;还能在保护隐私的同时&#xff0c;确保数据传输的稳定与安全。但面对市面上琳琅满目的代理服务&#xff0c;如何…

IVI(In-Vehicle Infotainment,智能座舱的信息娱乐系统)

IVI能够实现包括三维导航、实时路况、辅助驾驶等在线娱乐功能。 IVI人机交互形式&#xff08;三板斧&#xff09;&#xff1a;声音、图像、文字 IVI人机交互媒介I&#xff08;四件套&#xff09;&#xff1a;中控屏幕&#xff08;显示、触控&#xff09;、仪表显示、语言、方…

目标检测 | YOLO v1、YOLO v2、YOLO v3与YOLO v3 SPP理论讲解

☀️教程&#xff1a;霹雳吧啦Wz ☀️链接&#xff1a;https://www.bilibili.com/video/BV1yi4y1g7ro?p1&vd_sourcec7e390079ff3e10b79e23fb333bea49d 一、YOLO v1 针对于two-stage目标检测算法普遍存在的运算速度慢的缺点&#xff0c;YOLO创造性的提出了one-stage目标检测…

2024-07-20 Unity插件 Odin Serializer2 —— 序列化教程

文章目录 1 由根对象决定序列化2 实现 Odin 序列化器2.1 继承已有序列化类2.2 自定义序列化类 3 避免 Unity 无限深度警告4 指定序列化秘钥4.1 External String Reference Resolver4.2 External GUID Reference Resolver4.3 External Index Reference Resolver 4 功能与限制4.1…

为什么我不建议用Excel做进销存系统?

进销存管理系统是一个企业中非常关键的部分&#xff0c;它涉及商品的采购、销售和库存管理等复杂流程。虽然EXCEL作为一个办公软件&#xff0c;它的通用性和灵活性使其能够处理这类数据&#xff0c;但实际上&#xff0c;使用它来构建专业的进销存管理系统存在一些明显的局限性。…

haproxy服务介绍

haproxy 搭建使用开启HAProxy的界面UI配置负载均衡配置web代理 HAProxy&#xff08;High Availability Proxy&#xff09;是一个高性能的TCP/HTTP负载均衡器和代理服务器&#xff0c;广泛用于提升Web应用的可用性和性能。[官网说明](https://docs.haproxy.org/2.8/intro.html#3…

NLP: 词袋模型和TFIDF模型

文章目录 词袋模型TF-IDF模型词汇表模型 词袋模型 文本特征提取有两个非常重要的模型&#xff1a; 词集模型&#xff1a;单词构成的集合&#xff0c;集合自然每个元素都只有一个&#xff0c;也即词集中的每个单词都只有一个。 词袋模型&#xff1a;在词集的基础上如果一个单词…

autoxjs的安装与配置

AutoxJs 是一个基于 JavaScript 的自动化工具&#xff0c;用于在 Android 平台上创建自动化脚本。它是在原 Auto.js 项目的基础上继续维护和升级而来的。 AutoxJs 的优势主要包括以下几点&#xff1a; 无需 root 权限&#xff1a;可以在没有 root 权限的设备上运行大部分功能&…

JavaWeb系列二十三: web 应用常用功能(文件上传下载)

文件上传下载 基本介绍文件上传基本原理文件上传应用实例文件上传注意事项和细节 文件下载基本原理文件下载应用实例文件下载注意事项 ⬅️ 上一篇: JavaWeb系列二十二: 线程数据共享和安全(ThreadLocal) &#x1f389; 欢迎来到 JavaWeb系列二十三: web 应用常用功能(文件上传…

创建最佳实践创建 XML 站点地图--SEO

您是否正在努力让您的网站被搜索引擎索引&#xff1f;您想提高您网站的搜索引擎知名度吗&#xff1f;如果是&#xff0c;您可能会错过 XML 站点地图的重要性。XML 站点地图在改善您网站的 SEO 方面发挥着至关重要的作用。‍ XML 站点地图是您网站结构的蓝图&#xff0c;可帮助…

YOLOv5项目梳理

1 项目介绍 参考项目&#xff1a;YOLO项目 1.1训练模型 YOLOv5模型 train.py 训练预训练模型 ... ... def parse_opt(knownFalse):# 命令行参数解析器初始化parser argparse.ArgumentParser()# 初始权重路径&#xff0c;默认为 ROOT / yolov5s.pt&#xff0c;用于指定模…

Navicat 17 for Mac 数据库管理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕。2. 应用程序/启动台显示Navicat图标&#xff0c;表示安装成功。 二、运行测试运行后提示&#xff1a;“Navicat Premium.pp”已损坏&#x…

在qt的c++程序嵌入一个qml窗口

//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…

redis面试基础知识

redis的数据类型 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&#xff1a; 五种基本数据类型 Redis 通用命令 通用指令是部分数据类型的&#xff0c;都可以使用的指令&#xff0c;常见的有&#xff1a; KEYS&#xff…

思维(交互题),CF 1990E2 - Catch the Mole(Hard Version)

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 E2 - Catch the Mole(Hard Version) 二、解题报告 1、思路分析 考虑每次误判都会让鼹鼠上升一层&#xff0c;相应的&#xff0c;最外层的一层结点都没用了 由于数据范围为5000&#xff0c;我们随便找个叶子…

Electron案例解析-编写一个简单的electron程序

index.html <!DOCTYPE html> <html> <head><meta charset"UTF-8" /><!-- 内容安全策略--><metahttp-equiv"Content-Security-Policy"content"default-src self; script-src self"/><metahttp-equiv&quo…