Qt扫盲-QFile理论总结

2023-11-07

1. 概述

QFile 类是一种用于读取和写入文本和二进制文件资源的 I/O 工具类。QFile 类可以单独使用来读写文件,也可以更方便地 和 QTextStream、QDataStream一起使用,在2,3就是记录一下使用的不同点。

我们可以直接在QFile构造的时候设置待操作的文件名(带路径的文件名哈)中传递,也可以随时使用 setFileName() 进行设置。QFile 要求文件路径分隔符为“/”,屏蔽了不同操作系统使用不同的路径。不支持使用其他分隔符(例如,在Windows下文件分隔符就是“\”)。

//这个路径就是对的
QFile file("C:\Users\zhanghongyuan\Desktop\temp\1.txt");

//下面是不对的,使用双 // 也是不推荐的哈
QFile file("C:/Users/zhanghongyuan/Desktop/temp\1.txt");

我们可以使用 exists() 检查文件是否存在,并使用 remove() 删除文件。(更高级的文件系统相关操作由QFileInfo和QDir提供。

文件使用 open() 打开,使用 close() 关闭,并使用 flush() 刷新,也就是立刻把数据写到文件里,一般都是不管的由操作系统自己决定的。

数据通常使用 QDataStream 或 QTextStream 进行读写(更灵活),但我们也可以调用 QIODevice 继承的函数 read() 、readLine() 、readAll() 、write() 。QFile 还继承了 getChar() 、putChar() 和 ungetChar() ,它们一次处理一个字符。

文件的大小由 size() 返回。还可以使用 pos() 获取当前文件位置,也可以使用 seek() 移动到新的文件位置。如果已到达文件的末尾,atEnd() 返回 true,这个就是判断文件是否读完的标志。

2. 直接操件文件

看下面的例子,我一般就是直接 copy 过去再改改就好。

给 open() 的 QIODevice::Text 标志告诉 Qt 将 Windows 样式的行终止符 (“\r\n”) 转换为 C++ 形式的行终止符 (“\n”)。默认情况下,QFile 假定文件的内容是二进制的,即它不对存储在文件中的字节执行任何转换。像用 流的方式读的话就会把文件的内容转成 QString 类型的 Unicode 。所有我们得出一个结论:读二进制数据的话就用这种直接的方式就好。当然我们读取到的内容 可以把 QByteArray 转成QString类型的哈,前提是文件里确实可以转的字符串格式。

QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
	return;

while (!file.atEnd()) {
	QByteArray line = file.readLine();
	process_line(line);
}

这个是逐行读取,

如果是要一次性读完的话就用:readAll()
如果要读指定的大小的文本就用:read(qint64 maxSize) 通过设置 maxSize来指定读取大小

对于精细化的读取就用 getChar() 、putChar() 和 ungetChar() 这种和C语言的基本一致。

3. 用 流 方式 操作 文件

1. 读取文件

下面是用 来读文件。也是推荐读文本文件的方式

QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
	return;

QTextStream in(&file);
while (!in.atEnd()) {
	QString line = in.readLine();
	process_line(line);
}

QTextStream 会将存储在磁盘上的 8 位数据转换为 16 位 Unicode 格式 QString类型。默认情况下,QTextStream 会假定使用用户系统的本地 8 位编码(例如,在大多数基于 unix 的操作系统上为 UTF-8;有关详细信息,请参阅 QTextCodec::codecForLocale())。这可以使用QTextStream::setCodec() 进行设置。有时候从文件里读取乱码就得用
setCodec()来设置文件的编码格式。常用的格式也就是 setCodec的参数有"ISO 8859-1", “UTF-8”, 和 “UTF-16”。

QTextStream out(&file);
out.setCodec("UTF-8"); //能解决很多问题

2. 写文本文件

要写入文本,我们可以使用运算符 <<() ,它重载在左侧获取 QTextStream,在右侧获取各种数据类型(包括 QString):

QFile file("out.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
	return;

QTextStream out(&file);
out << "The magic number is: " << 49 << "\n";

//关闭文件
file.close();

3. 二进制流读写

QDataStream 与此类似,您可以使用运算符<<() 写入数据,并使用运算符>>() 将其读回。有关详细信息,请参阅类文档。DataStream 是编码信息的二进制流,100%独立于主机的操作系统,CPU或字节顺序。例如,由 Windows 下的 PC 写入的数据流可以由运行 Solaris 的 Sun SPARC 读取。

//写入二进制文件
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);   // we will serialize the data into the file
out << QString("the answer is");   // serialize a string
out << (qint32)42;        // serialize an integer
  
// 从二进制文件读
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);    // read the data serialized from the file
QString str;
qint32 a;
in >> str >> a;           // extract "the answer is" and 42

当您使用 QFile、QFileInfo和 QDir 通过 Qt 访问文件系统时,您可以使用 Unicode 文件名。在 Unix 上,这些文件名被转换为 8 位编码。如果要使用标准C++ API(或)或特定于平台的 API 而不是 QFile 来访问文件,则可以使用 encodeName() 和 decodeName() 函数在 Unicode 文件名和 8 位文件名之间进行转换。因为 QByteArray 可以转成 char * 类型的字符串。

  • QByteArray QFile::encodeName(const QString &fileName) -> 把 Unicode 的 QString 转成 8进制的 QByteArray
  • QString QFile::decodeName(const QByteArray &localFileName) -> 把 8进制的 QByteArray 转成 Unicode 的 QString

4. 静态函数

函数名 含义
copy(const QString &fileName, const QString &newName) 复制旧文件到新文件,会创建但不会覆盖,而且失败了会返回值
exists(const QString &fileName) 判断文件是否存在
link(const QString &fileName, const QString &linkName) 就是创建快捷方式是 linkName 指向 fileName,也是创建新文件
permissions(const QString &fileName) 这个平台性的,和 linux 的 9中 rwx 对应
remove(const QString &fileName) 删除文件
rename(const QString &oldName, const QString &newName) 重命名文件
resize(const QString &fileName, qint64 sz) 重置文件大小
setPermissions(const QString &fileName, QFileDevice::Permissions permissions) 设置权限
symLinkTarget(const QString &fileName) 从 快捷方式找到源文件

5. 不同系统存在的问题

在 Unix 系统上,有一些特殊的系统文件(例如在 /proc 中),size() 将始终返回 0,但您仍然可以从这样的文件中读取更多数据;数据是在直接响应您调用 read() 时生成的。但是,在这种情况下,您不能使用 atEnd() 来确定是否有更多数据要读取(因为对于声称大小为 0 的文件,atEnd() 将返回 true)。/proc/modules 逐行:
相反,应该调用 readAll() ,或者重复调用 read() 或 readLine() ,直到无法读取更多数据。下一个示例使用 QTextStream 读取

QFile file("/proc/modules");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
	return;

QTextStream in(&file);
QString line = in.readLine();
while (!line.isNull()) {
	process_line(line);
	line = in.readLine();
}

权限问题:
文件权限在类Unix系统和Windows上的处理方式不同。在类 Unix 系统上的不可写目录中,无法创建文件。在Windows上并非总是如此,例如,“我的文档”目录通常不可写,但仍然可以在其中创建文件。
Qt 对文件权限的理解是有限的,这尤其影响了 QFile::setPermissions() 函数。在Windows上,Qt将仅设置传统的只读标志,并且仅在不传递任何Write*标志时设置。Qt不操作访问控制列表(ACL),这使得此功能对 NTFS卷 几乎没用。它可能仍然适用于使用 VFAT 文件系统的 U 盘。POSIX ACL 也不会有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt扫盲-QFile理论总结 的相关文章

  • 关于Qt中使用QFile打开文件时遇到问题的分析

    项目场景 xff1a 在文件打开的时候 xff0c 使用QFile的QIODevice的不同模式 xff0c 会出现不同的表现 xff08 这是我一个同事当时遇到的问题 xff0c 现在拿来分析分析 xff0c 以下的所有事例代码均用于示范
  • Qt QFile文件操作详解

    文章目录 QFile文件操作QFile 43 QTextStreamQFile 43 QDataStream 文件操作是非常重要的 xff0c 是数据持久化的方法 通过文件操作 xff0c 我们可以把在软件中设置的数据保存起来 已剪辑自 h
  • Qt扫盲-QMouseEvent 鼠标事件

    QMouseEvent 鼠标事件理论 一 概述 二 鼠标事件的传递 三 组合修饰符 四 鼠标坐标位置 五 使用方式 一 概述 当在QWidget窗口内的鼠标按钮被按下或释放 或者鼠标光标被移动时 就会发生鼠标事件 鼠标按下释放没有什么特殊的
  • Qt扩展-KDDockWidgets 简介及配置

    Qt扩展 KDDockWidgets 简介及配置 一 概述 二 编译 KDDockWidgets 库 1 Cmake Gui 中选择源文件和编译后的路径 2 点击Config 配置好编译器 3 点击Generate 4 在存放编译的文件夹输
  • Qt扫盲-QFile理论总结

    QFile理论总结 1 概述 2 直接操件文件 3 用 流 方式 操作 文件 1 读取文件 2 写文本文件 3 二进制流读写 4 静态函数 5 不同系统存在的问题 1 概述 QFile 类是一种用于读取和写入文本和二进制文件资源的 I O
  • Qt扫盲-QKeyEvent 键盘事件

    QKeyEvent 键盘事件 一 概述 二 事件传播 三 常用属性 1 key 2 modifiers 3 isAutoRepeat 4 text 四 简单组合键代码 一 概述 QKeyEvent 是Qt 里面描述键盘事件的一个属性类 所有
  • Qt扫盲-QWidget理论使用总结

    QWidget理论使用总结 一 概述 二 顶层 控件 和子 控件 三 复合控件 四 自定义控件和绘制 五 大小提示和大小策略 六 事件 七 一组函数和属性 八 QWidget样式表 九 透明度和双缓冲 十 创建半透明窗口 一 概述 widg
  • Qt扫盲-QVariant理论使用总结

    Qt扫盲 QVariant理论使用总结 一 概述 二 使用用例 三 关于GUI类型的说明 四 连续使用canConvert 和convert 一 概述 QVariant 是一个用来存放变体数据的工具类 因为c 禁止 union 包含具有非默
  • QFileDialog打开文件夹,获得文件名(getOpenFileName,getExistingDirectory)

    1 QFileDialog getOpenFileName 示例 括号里的参数分别是 指定父类窗口部件 对话框使用的标题 默认打开后显示的目录 即告诉它从哪一级目录开始 右下角的文件过滤器 QString file name QFileDi
  • QFile的文件清空操作

    QFile file etc wpa supplicant conf file open QIODevice ReadOnly QTextStream io file file close file open QIODevice Trunc
  • Qt扫盲-QStackedWidget理论总结

    QStackedWidget理论总结 1 简述 2 布局用法 3 页面切换 4 常用功能 1 简述 QStackedWidget和QTabWidget的功能类似 都是为解决大量的控件在一个页面上可能显示不出来 同时呢 这些控件也可以按一定方
  • Qt扫盲-QSS概述

    QSS概述 一 概述 二 详细 一 概述 QSS 其实是Qt样式表 Qt样式表是Qt界面的一种强大的机制 除了通过继承QStyle已经可以实现的功能外 它还允许您自定义窗口组件的外观 Qt样式表的概念 术语和语法很大程度上受到HTML层叠样
  • QFile::copy() 的进度条?

    我正在制作一个在 Qt 中复制文件的程序 我想知道我该如何使用QProgressBar with bool QFile copy const QString fileName const QString newName 这是否有可能copy
  • QFile 打开文件写入失败

    我正在尝试打开文件并向其中写入一些文本数据 QFile out test txt if out open QIODevice ReadWrite QMessageBox msgBox msgBox setText out errorStri
  • 如何序列化 QMap?

    我正在尝试学习如何使用以下代码在窗口应用程序中序列化 QMap 对象 include mainwindow h include ui mainwindow h include
  • Qt 无法创建/写入 C:\

    我正在编写一个 Qt 程序 最初适用于 Windows 7 4 7 需要写入安装目录 C Program Files 当我尝试写入 受保护 的位置 程序文件 C 等 时 没有创建任何文件 但是 QFile 没有给我任何错误代码 error
  • 即使文件存在,如何修复 QFile 打开错误(未知错误)?

    我正在尝试打开并阅读map dat文件使用QFile接口 但它不会打开该文件 即使它确实存在于目录中 我努力了fopen ifstream在 C 中 但他们一直告诉我该文件不存在 即使我已将其添加到资源文件夹中 qrc 然后我转向QFile
  • QFile:如何有效地读取从 k 到 k+L 的字节

    我可以从 QFile 读取从 k 到 k L 的字节 将第一个整个文件读入 QByteArray if file open QIODevice ReadOnly QByteArray blob file readAll QByteArray
  • 如何在 Qt 5 中写入和读取 QResource 文件?

    很奇怪 我通过以下方式将所需的文件添加到资源中添加现有文件 文件就在那里 我运行 qmake 构建 gt 运行 qmake 以使文件可用 第一期 我无法从输出终端向文件写入任何内容 但是当我手动写入文件时 每次运行它时输出终端都会显示更改
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev

随机推荐

  • 计算机原码补码和反码的计算方法,一个数的原码,反码,补码怎么算,原码 反码 补码...

    数在计算机中是以二进制形式表示的 数分为有符号数和无符号数 原码 反码 补码都是有符号定点数的表示方法 一个有符号定点数的最高位为符号位 0是正 1是副 以下都以8位整数为例 原码就是这个数本身的二进制形式 例如 0000001 就是 1
  • Vue3+ts+element-plus 组件的二次封装-- 头部搜索条件的封装

    Vue 常用笔记 本人是一个web前端开发工程师 主要是vue框架 整理了一些Vue常用的技术 一方面是分享 一方面是做总结 今后也会一直更新 有好建议的同学欢迎评论区分享 Vue专栏 点击此处 Vue组件库专栏 点击此处 Vue2 vs
  • Unity中同时修改物体及其所有子物体层级

    简单说一下思路 首先你得判定当前物体是否有子物体 没有的话就直接设置层级 有的话就再回到1 继续判断子物体下是否还有子物体 接下来结合代码再好好理解一下 private void ChangeLayer Transform transfor
  • matlab实现牛顿下山法

    说起牛顿下山法 首先要提牛顿法 牛顿法是求解非线性方程的一个重要方法 具体可以点击牛顿法 虽然牛顿法作为一个二阶的迭代收敛方法 但是其对于函数和初始点的要求都比较高 而牛顿下山法则是有效降低这些要求的一种技巧 牛顿下山法的迭代公式如下 x
  • [C/C++] 创建后台接受命令程序

    C C 多线程时 运行时输入自定义参数 达到控制线程的目的 基础概念 线程 线程是操作系统能够进行运算调度的最小单位 它被包含在进程之中 进程包含一个或者多个线程 进程可以理解为完成一件事的完整解决方案 而线程可以理解为这个解决方案中的的一
  • 弹性布局-更优秀的Flex

    Flex布局详解 浮动布局的优缺点 图文的环绕显示 浮动元素 同行显示 适配性更好 忘记清浮动 高度坍塌 flex布局的优缺点 IE10以下不支持 用来做布局的 很方便 flex布局 flex flexible 弹性布局 移动端用的最多 P
  • LeetCode——345. 反转字符串中的元音字母

    反转字符串中的元音字母 题目 思路 代码 结果 题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 思路 没有什么难度 很简单的数组判断交换 代码 clas
  • 操作系统——启动操作系统及ucore-lab0 coding

    花了一周多时间把操作系统的课程看了一遍 晚上结课的时候尝试性地想看着笔记的标题回忆一下内容 发现 嗯 一片混沌 趁热打铁做个总结吧 辅以uCoreLab上的coding 一个走 1 操作系统的启动 未启动前 os和Bootloader都存放
  • 图形学/OpenGL/3D数学/Unity

    1 场景管理的数据结构 总结 游戏开发最常用的空间数据结构是四叉 八叉树和BVH树 而BSP树基本上只能应用于编辑器上 k d树则只能用在特殊问题应用场景 2 帧同步与状态同步 https gameinstitute qq com comm
  • lattice 包中的直方图绘制

    1 直方图 library lattice install packages nutshell library nutshell histogram DBWT DPLURAL data births2006 smpl main births
  • 记一次Swagger页面报错/error 404的排查过程

    记一次Swagger页面报错 error 404的排查过程 使用springfox swagger ui展示的页面如下 Maven引用 使用springfox swagger ui展示的页面如下 说是没有为 error这个路径指明确定的映射
  • Java中的注解和反射

    文章目录 Java中的注解和反射 一 注解 1 1注解Annotation的作用 1 2注解Annotation的格式 1 3注解Annotation在哪里使用 1 4实例 二 内置注解 三 元注解 四 自定义注解 五 静态和动态语言 5
  • 2022年浙江省中职组“网络空间安全”赛项模块B--Windows渗透测试

    2022年中职组浙江省 网络空间安全 赛项 B 1 Windows渗透测试 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段 单兵模式系统渗透测试 任务一 Windows
  • Notepad++ 文件丢失了,找回历史文件方法

    Notepad 文件丢失了 找回历史文件方法 C Users 你当前用户的用户名 AppData Roaming Notepad backup
  • Linux防火墙iptables(二)之SNAT和DNAT

    目录 一 SNAT 1 概述 2 开启SNAT的命令 3 SNAT转换1 固定的公网IP地址 4 SNAT转换2 非固定的公网IP地址 共享动态IP地址 5 实验 二 DNAT 1 DNAT应用环境 2 DNAT原理 3 DNAT转换前提条
  • 解决react-native-image-picker在RN0.6以上上调不起相机问题

    1 需要link react native link react native image picker 2 在android settings gradle文件中添加如下代码 include react native image pick
  • 算法设计与分析-DP习题

    7 1 最小路径和 给定一个m行n列的矩阵 从左上角开始每次只能向右或者向下移动 最后到达右下角的位置 路径上的所有数字累加起来作为这条路径的和 求矩阵的最小路径和 输入格式 输入第一行 两个正整数m和n 1 lt m n lt 1000
  • Altium Designer 学习笔记(原理图库)

    1 AD工程的组成部分 源文件 原理图 PCB图 库文件 原理图库 PCB原件库 一定要建工程 不要只建原理图和PCB 建立了工程才能在原理图和PCB之间建立联系 2 绘制原理图库 电阻容 放置引脚 快捷键 P P 在放置的过程中按TAB可
  • opengl_shader在线教程,GLSL  着色器语言学习入门学习

    下面2个网址对GLSL 着色器语言学习入门学习挺有帮助的 https thebookofshaders com 07 lan ch opengl入门教程 https learnopengl cn github io
  • Qt扫盲-QFile理论总结

    QFile理论总结 1 概述 2 直接操件文件 3 用 流 方式 操作 文件 1 读取文件 2 写文本文件 3 二进制流读写 4 静态函数 5 不同系统存在的问题 1 概述 QFile 类是一种用于读取和写入文本和二进制文件资源的 I O