QT基础 - 文本文件读写

news2024/11/26 21:24:13

目录

零. 前言

一.读取文件

二. 写入文件

三. 和二进制读写的区别


零. 前言

在 Qt 中,对文本文件进行读写操作是常见的任务之一。这对于保存和加载配置信息、处理数据文件等非常有用。

Qt 提供了多种方式来读写文本文件,使得文件操作变得相对简单和直观。

读取文本文件

可以使用 QFile 和 QTextStream 类来读取文本文件的内容。

首先,创建一个 QFile 对象并指定要读取的文件路径。然后,打开文件并检查是否成功打开。如果成功,创建一个 QTextStream 对象与文件关联,然后通过 QTextStream 来逐行或逐个字符地读取文件内容。

写入文本文件

类似地,创建 QFile 对象,指定写入的文件路径,打开文件(如果文件不存在,可能会创建新文件)。然后,创建 QTextStream 对象与文件关联,通过 QTextStream 向文件中写入文本内容。

在进行文件读写操作时,需要注意处理可能出现的错误情况,例如文件不存在、无法打开、写入失败等。

通过掌握 Qt 中的文本文件读写操作,能够有效地在应用程序中与外部文件进行数据交互,增强应用程序的功能和灵活性。

复制重新生成

一.读取文件

QFile类是用于读取和写入文件的核心类之一。通过QFile类,我们可以实现对文件的打开、读取数据、写入数据以及关闭等操作。

QFile类的一些重要属性包括文件路径(通过构造函数或setFileName()方法设置)和文件打开模式。

文件打开模式可以是以下枚举值之一:

  • QIODevice::NotOpen:未打开。
  • QIODevice::ReadOnly:以只读方式打开。
  • QIODevice::WriteOnly:以只写方式打开。
  • QIODevice::ReadWrite:以读写方式打开。
  • QIODevice::Append:以追加的方式打开,新增加的内容将被追加到文件末尾。
  • QIODevice::Truncate:以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。
  • QIODevice::Text:在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如在 Win32 平台上是 \r\n
  • QIODevice::Unbuffered:忽略缓存。

方法

  1. open():用于打开文件。
  2. read() / readLine() / readAll():用于读取文件数据。readAll() 可以读取文件的全部内容;readLine() 用于逐行读取文件内容。
  3. write():用于向文件写入数据。
  4. close():关闭文件,释放相关资源。关闭文件很重要,因为它可以确保数据被正确写入磁盘,并释放文件描述符等相关资源。文件描述符表存在上限,如果一直打开文件而不关闭,可能会导致文件描述符表被占满,后续无法再打开新文件。

示例代码

以下是一个简单的 Qt读取文件的示例代码,它打开一个文件并读取其内容显示在控制台:

#include <QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString filePath = "E:\\QTCode\\One\\Two\\test\\test.txt"; // 替换为实际的文件路径

    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "Failed to open file";
        return -1;
    }

    QByteArray data = file.readAll();
    QString text = QString::fromUtf8(data);

    qDebug() << text;

    file.close();

    return a.exec();
}

在上述示例中,首先创建了一个QFile对象并指定要打开的文件路径。然后使用open()方法以只读和文本模式打开文件。如果打开成功,使用readAll()方法读取文件的全部内容,并将其存储在QByteArray中,再通过QString::fromUtf8()将字节数组转换为QString以便显示。最后,使用close()方法关闭文件

效果图

二. 写入文件

在 Qt 中,写入文件是将数据保存到外部文件的操作。这使得程序能够持久化存储信息,以便在后续运行中使用或与其他程序共享数据。

属性

与写入文件相关的属性通常包括文件路径(指定要写入的文件位置)和文件打开模式(如只写、读写、追加等)。

方法

  1. open():用于以指定的模式打开文件。
  2. write():将数据写入文件。
  3. flush():强制将缓冲区中的数据写入文件。
  4. close():关闭文件,确保数据完整写入并释放资源。

示例代码

#include <QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString filePath = "E:\\QTCode\\One\\Two\\test\\test.txt";  // 要写入的文件路径

    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug() << "Failed to open file for writing";
        return -1;
    }

    QTextStream out(&file);
    out << "This is a line of text.\n";
    out << "This is another line.\n";

    file.close();

    return a.exec();
}

在上述示例中,首先指定了文件路径。然后创建 QFile 对象并以只写和文本模式打开文件。通过 QTextStream 对象将文本内容写入文件。最后关闭文件以确保数据被正确保存。

效果图

三. 和二进制读写的区别

二进制读写和文本文件读写的主要区别在于数据的表示和处理方式。

二进制读写是将数据以其二进制形式直接进行读取和写入,不进行任何额外的编码或转换。它可以处理各种类型的数据,包括图像、视频、音频等没有特定编码的二进制数据,也可以处理 C++基本类型(如 int、char、short 等)和复杂的数据类型(如自定义的类)。

在二进制读写中,数据的存储和读取是按照其原始的字节序列进行的。例如,写入一个整数时,就是将该整数的二进制位直接写入文件;读取时也会按照相同的字节顺序还原出原始的整数。

二进制读写的优点包括:

  • 效率高,因为不需要进行编码和解码的转换过程。
  • 能够准确地保存和恢复数据的原始形式,不会受到编码或文本格式的限制。

然而,二进制文件不是人可读的,直接查看二进制文件的内容通常是无意义的。

相比之下,文本文件读写是处理人可读的文本内容。在写入时,会根据特定的编码(如 ASCII、UTF-8 等)将字符转换为对应的二进制表示;读取时则进行相反的解码操作,将二进制数据转换为人类可理解的文本字符。

文本文件的优点是:

  • 人可以直接打开并查看和理解文件的内容。

但文本文件读写也有一些限制:

  • 对于非文本数据(如图像、音频等),如果强行以文本方式读写,可能会导致数据丢失或损坏。
  • 由于需要进行编码和解码转换,可能会有一些性能开销。

例如,使用QDataStream进行二进制读写时,它提供了基于QIODevice的二进制数据序列化。可以方便地对文件、网络套接字等进行读写操作,并且可以存取 C++基本类型和复杂的数据类型。而使用QTextStream操作文本文件时,它会自动将 Unicode 编码同操作系统的编码进行转换,也会处理换行符的转换。

在实际应用中,选择二进制读写还是文本文件读写取决于具体的需求。如果需要处理非文本数据、追求效率或需要精确保存数据的原始形式,通常会选择二进制读写;如果数据主要是人类可读的文本内容,并且希望人能够直接查看和编辑文件,那么文本文件读写更合适。

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

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

相关文章

攻防世界-intoU

下载附件发现是wav文件&#xff0c;扔Audacity里面 将采样率&#xff08;右击选择&#xff09;改为900&#xff0c;之后再查看频谱图 再将进度条拉到最后 得到flag&#xff1a; RCTF{bmp_file_in_wav}

最新版ChatGPT对话系统源码 Chat Nio系统源码

最新版ChatGPT对话系统源码 Chat Nio系统源码 支持 Vision 模型, 同时支持 直接上传图片 和 输入图片直链或 Base64 图片 功能 (如 GPT-4 Vision Preview, Gemini Pro Vision 等模型) 支持 DALL-E 模型绘图 支持 Midjourney / Niji 模型的 Imagine / Upscale / Variant / Re…

二,SpringFramework

二、SpringFramework实战指南 目录 一、技术体系结构 1.1 总体技术体系1.2 框架概念和理解 二、SpringFramework介绍 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模块2.3 SpringFramework 主要优势 三、Spring IoC容器和核心概念 3.1 组件和组件管理概念3…

【深度学习驱动流体力学】OpenFOAM框架剖析

目录 1. applications 目录solvers:存放各种求解器。mesh:网格生成相关工具。2. src 目录3. tutorials 目录其他主要目录和文件参考OpenFOAM 源码文件目录的框架如下,OpenFOAM 是一个开源的计算流体力学 (CFD) 软件包,其源码文件结构设计精巧,分为多个主要目录,每个目录都…

jeecg-boot项目的部署-windows系统

一、基础环境的准备&#xff1a; 1、后台基础环境&#xff1a;JDK、redis、数据库&#xff1a;sqlserver 2、前端基础环境&#xff1a;nginx redis和nginx的安装都很方便&#xff0c;直接去对应的官网&#xff0c;下载zip压缩包&#xff0c;然后解压&#xff0c;执行.exe文件…

制作WIFI二维码,实现一键扫描连接WIFI

在现代社会&#xff0c;Wi-Fi已成为我们日常生活中不可或缺的一部分。无论是在家庭、办公室还是公共场所&#xff0c;我们都希望能够快速方便地连接到Wi-Fi网络。下面小编就来和大家分享通过制作WIFI二维码&#xff0c;来实现一键扫描就可以连接WIFI的方法。连接WIFI不用在告诉…

计算机网络 VLAN间路由单臂路由

一、理论知识 VLAN是一种将物理网络划分成多个逻辑网络的方法。不同的VLAN属于不同的网段&#xff0c;因此互相通信需要通过路由器进行路由。通常情况下&#xff0c;在同一VLAN内的设备可以直接通信&#xff0c;而不同VLAN之间的设备则需要通过路由器转发数据。本实验利用单臂…

洛谷——P2824 排序

题目来源&#xff1a;[HEOI2016/TJOI2016] 排序 - 洛谷https://www.luogu.com.cn/problem/P2824 问题思路 本文介绍一种二分答案的做法&#xff0c;时间复杂度为&#xff1a;(nm)*log(n)*log(n).本题存在nlog(n)的做法&#xff0c;然而其做法没有二分答案的做法通俗易懂. 默认读…

水系统阻力计算

所谓水泵的选取计算其实就是估算&#xff08;很多计算公式本身就是估算的&#xff09;&#xff0c;估算分的细致些考虑的内容全面些就是精确的计算。 特别补充&#xff1a;当设计流量在设备的额定流量附近时&#xff0c;上面所提到的阻力可以套用&#xff0c;更多的是往往都大…

【前端技术】标签页通讯localStorage、BroadcastChannel、SharedWorker的技术详解

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Apple - Text Attribute Programming Topics

本文翻译整理自&#xff1a;Text Attribute Programming Topics&#xff08;更新日期&#xff1a;2004-02-16 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextAttributes/TextAttributes.html#//apple_ref/doc/uid/10000088i 文章目录 一、文…

http发展史(http0.9、http1.0、http1.1、http/2、http/3)详解

文章目录 HTTP/0.9HTTP/1.0HTTP/1.1队头阻塞&#xff08;Head-of-Line Blocking&#xff09;1. TCP 层的队头阻塞2. HTTP/1.1 的队头阻塞 HTTP/2HTTP/3 HTTP/0.9 发布时间&#xff1a;1991年 特点&#xff1a; 只支持 GET 方法没有 HTTP 头部响应中只有 HTML 内容&#xff0…

C语言入门系列:可迁移的数据类型

文章目录 1&#xff0c;精确宽度类型(exact-width integer type)2&#xff0c;最小宽度类型&#xff08;minimum width type&#xff09;3&#xff0c;最快的最小宽度类型&#xff08;fast minimum width type&#xff09;4&#xff0c;可以保存指针的整数类型。5&#xff0c; …

云原生微服务开发日趋成熟:有效拥抱左移以改善交付

在软件工程和应用程序开发方面&#xff0c;云原生已经成为许多团队的常用术语。当人们调查云原生的世界时&#xff0c;他们经常会得出这样的观点&#xff1a;云原生的整个过程都是针对大型企业应用程序的。几年前&#xff0c;情况可能确实如此&#xff0c;但随着 Kubernetes 等…

Redis-使用 jedis 操作数据

文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…

45、基于深度学习的螃蟹性别分类(matlab)

1、基于深度学习的螃蟹性别分类原理及流程 基于深度学习的螃蟹性别分类原理是利用深度学习模型对螃蟹的图像进行训练和识别&#xff0c;从而实现对螃蟹性别的自动分类。整个流程可以分为数据准备、模型构建、模型训练和性别分类四个步骤。 数据准备&#xff1a; 首先需要收集包…

C# 中的隐式和显式类型转换

当你需要转换值的类型时&#xff0c;可以使用类型转换。只有当你要转换的两种类型兼容时&#xff0c;才有可能。 当你收到错误“无法隐式将一种类型转换为另一种类型”时&#xff0c;说明你转换的两种类型不兼容。 int integer; // 声明一个名为 integer 的整型变量 integer …

【Gradio】如何设置 Gradio 数据框的样式

简介 数据可视化是数据分析和机器学习的关键方面。Gradio DataFrame 组件是一种流行的方式&#xff0c;在网络应用程序中显示表格数据&#xff08;特别是以 pandas DataFrame 对象的形式&#xff09;。 本文将探讨 Gradio 的最新增强功能&#xff0c;这些功能允许用户整合 pand…

解决vmware “处理器不支持 XSAVE。无法打开此虚拟机的电源。“

1,打开windows 10-11 的 虚拟机平台 选择 “开始”&#xff0c;输入“Windows 功能”&#xff0c;然后从结果列表中选择“打开或关闭 Windows 功能 ”。 在刚刚打开的 “Windows 功能”窗口中&#xff0c;找到“虚拟机平台 ”并将其选中。 选择“确定”。 可能需要重启电脑。…

节能减排如何替电子行业巨头降低成本

尖端科技与环境之间的矛盾&#xff0c;已经不再是科幻小说家笔下的虚构。 先进芯片制造从熔化硅开始&#xff0c;到使用大功率激光进行光刻&#xff0c;再到创造和维护真空状态&#xff0c;以及持续清洁工作&#xff0c;每一个环节都需要大量的电力支持。据统计&#xff0c;半…