QT基础 - 文本文件读写

目录

零. 前言

一.读取文件

二. 写入文件

三. 和二进制读写的区别


零. 前言

在 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.mzph.cn/news/857412.shtml

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

相关文章

SwiftUI 6.0(iOS 18)ScrollView 全新的滚动位置(ScrollPosition)揭秘

概览 在只有方寸之间大小的手持设备上要想体面的向用户展示海量信息&#xff0c;滚动视图&#xff08;ScrollView&#xff09;无疑是绝佳的“东牀之选”。 在 SwiftUI 历史的长河中&#xff0c;总觉得苹果对于 ScrollView 视图功能的升级是在“挤牙膏”。这不&#xff0c;在本…

spire.Pdf 将pdf转成image

一、nuget安装 <ItemGroup><PackageReference Include"Spire.PDF" Version"10.6.7" /></ItemGroup> 二、直接上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.IO;namespace …

乱弹篇(35)掩耳盗铃与两三十年

成语“ 掩耳盗铃 ”&#xff0c;比喻自己欺骗自己&#xff0c;明明是掩盖不住的事情偏要想法子掩盖。它多用来讽刺那些做事不想让别人知道&#xff0c;却偏偏又引起他人注意的人。 现在网络上以新浪微博和邪恶的“800727”为典型的自媒体平台和其掌控者&#xff0c;就是现代版…

提升研发效率:三品PLM解决方案在汽车汽配行业的实践

随着全球汽车市场的快速发展&#xff0c;中国汽车汽配行业迎来了前所未有的发展机遇。然而&#xff0c;在这一过程中&#xff0c;企业也面临着诸多挑战&#xff0c;如研发能力的提升、技术资料管理的复杂性、以及跨部门协作的困难等。为了应对这些挑战&#xff0c;三品产品生命…

模式分解算法-满足3NF的无损且保持函数依赖的分解算法、满足BCNF的无损连接分解算法

一、引言 1、对指定的关系模式&#xff0c;若范式级别较低&#xff0c;为第一范式或第二范式&#xff0c;由于存在数据冗余或更新异常问题&#xff0c;在实际中一般是不可用的&#xff0c;关系模式的规范化就是将满足低一级的关系模式分解为若干满足高一级范式的关系模式的集合…

Python轻松设置Excel单元格数字显示格式

Excel作为强大的数据处理与分析工具&#xff0c;不仅能够存储大量数据&#xff0c;还支持复杂的数据处理与可视化功能。而如何恰当地展示Excel表格中的数据是Excel文件制作的关键之一。这便涉及到Excel单元格数字格式的设置。数字格式不仅关乎数据的美学呈现&#xff0c;如货币…

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明&#xff0c;刚开始接触可能在理解上会有些困难&#xff0c;可以简单地把它理解为一个盲盒&#xff0c;你可以任意猜测盒子有什么东西&#xff0c;并认为这些东西真正存在而进行处理&#xff0c;等到真正打开时&#xff0…

网上的流量卡真的可以免费领取吗?

网上的流量卡真的可以免费领取吗&#xff1f;当然可以&#xff0c;目前运营商推出的流量卡都是可以免费领取的。 有很多朋友私信给小编&#xff0c;听说流量卡是免费领取的就觉得不太靠谱&#xff0c;其实这种想法是不对的&#xff0c;首先大家要换位思考一下&#xff0c;如果我…

Ubuntu配置ssh+vnc(完整版)

Ubuntu配置sshvnc&#xff08;完整版&#xff09; 1 配置ssh 1. 安装openssh-server&#xff0c;配置开机自启 # 更新包 sudo apt-get update # 安装openssh-server sudo apt-get install -y openssh-server # 启动服务 sudo service ssh start # 配置开机自启 sudo systemc…

细说MCU定时器模块的输入捕捉功能的实现方法

目录 一、工程背景 二、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、 配置定时器TIM1 4、 配置定时器TIM13 5、配置串口 6、配置中断 7、配置系统时钟 三、代码修改 1、使能TIM1输入捕捉功能和TIM3的PWM输出功能 2、自定义变量 3、重定义回调函数 4、输出到…

【国际化I18n使用方法】vue2使用i18简单实现多语种切换,刷新保持,动态数据处理

效果图 使用流程 总结就是&#xff0c;安装好插件后&#xff0c;配置几个语言的js文件&#xff0c;每个词都要在每个js内写一遍对应的语言&#xff0c;然后通过切换js文件拿到对应的语言&#xff0c;实现翻译的效果。然后当前使用什么语言保存到本地&#xff0c;这样刷新就可以…

【进阶篇-Day4:使用JAVA编写石头迷阵游戏】

目录 1、绘制界面2、打乱石头方块3、移动业务4、游戏判定胜利5、统计步数6、重新游戏7、完整代码&#xff1a; 1、绘制界面 上述思路是&#xff1a;使用一个二维数组存放图片的编号&#xff0c;然后在后持遍历即可获取对应的图片。 代码如下&#xff1a; package com.itheima.s…

取代煤气灶,新能源电燃灶真有那么牛吗

在当今社会&#xff0c;能源问题日益凸显&#xff0c;能源危机的警钟不断敲响。与此同时&#xff0c;人们对于生活品质和安全环保的要求也越来越高。在这样的背景下&#xff0c;一种号称能取代燃气灶和电磁炉的新能源电燃灶——华火电燃灶进入了人们的视野。 华火电燃灶的出现似…

SpringBoot整合justauth实现多种方式的第三方登陆

目录 0.准备工作 1.引入依赖 2.yml文件 3. Controller代码 4.效果 参考 0.准备工作 你需要获取三方登陆的client-id和client-secret 以github为例 申请地址&#xff1a;Sign in to GitHub GitHub 1.引入依赖 <?xml version"1.0" encoding"UTF-8&quo…

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下

1.从某超市顾客中随机抽取5名&#xff0c;他们的购物篮数据的二元0/1表示如下&#xff1a; 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…

Linux常用命令(16)—awk命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

Java 10新特性介绍

Java 10是Java平台的一个重要更新&#xff0c;它引入了多项新特性和改进。以下是一些主要的新特性&#xff1a; 局部变量类型推断&#xff08;var关键字&#xff09; Java 10允许使用var关键字来声明局部变量&#xff0c;而无需显式指定变量的类型。编译器会根据变量赋值的上下…

Android获取控件宽高的几种方式

第一种方式&#xff1a;在需要时获取&#xff0c;如控件点击时再获取 button.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { getTextWidthAndHeight(); } }); 第二种方式&#xff1a;重写onWindowFocusChanged()方法 Overr…

【机器学习】机器学习赋能交通出行:智能化实践与创新应用探索

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 交通流量预测与优化&#x1f31e;数据准备&#x1f319;模型训练与预测⭐评估模型与优化 &#x…

jsonpath_解析例子代码

# _*_ coding : utf-8 _*_ # Time : 2023-11-05 13:23 # Author : haowen # File : jsonpath_解析_淘票票 # Project : py练习 import urllib.request url https://dianying.taobao.com/cityAction.json?activityId&_ksTS1699161894273_112&jsoncallbackjsonp113&…