QFile文件操作方法

一.概述

QFile 类支持对文件进行读取、写入、删除、重命名、拷贝等操作,它既可以操作文件文件,也可以操作二进制文件。

二.QFile方法

1.使用 QFile 读写文件之前必须先打开文件,调用 open() 成员方法即可,常用的语法格式为:

bool QFile::open(OpenMode mode)

mode 参数用来指定文件的打开方式,下表罗列了此参数的可选值以及各自的含义:

表 1 QFile文件打开方式

打开方式

含 义

QIODevice::ReadOnly

只能对文件进行读操作

QIODevice::WriteOnly

只能对文件进行写操作,如果目标文件不存在,会自行创建一个新文件。

QIODevice::ReadWrite

等价于 ReadOnly | WriteOnly,能对文件进行读和写操作。

QIODevice::Append

以追加模式打开文件,写入的数据会追加到文件的末尾(文件原有的内容保留)。

QIODevice::Truncate

以重写模式打开,写入的数据会将原有数据全部清除。注意,此打开方式不能单独使用,通常会和 ReadOnly 或 WriteOnly 搭配。

QIODevice::Text

读取文件时,会将行尾结束符(Unix 系统中是 "\n",Windows 系统中是 "\r\n")转换成‘\n’;将数据写入文件时,会将行尾结束符转换成本地格式,例如 Win32 平台上是‘\r\n’。

根据需要,可以为 mode 参数一次性指定多个值,值和值之间用|分割。比如:

QIODevice::ReadOnly | QIODevice::Text:表示只允许对文件进行读操作,读取文件时,会将行尾结束符转换为 '\n';

QIODevice::WriteOnly | QIODevice::Text:表示只允许对文件进行写操作,将数据写入文件时,会将行尾结束符转换为本地格式;

QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text:表示对文件进行写操作,写入的数据会存放到文件的尾部,同时数据中的行尾结束符转换为本地格式。

注意,传递给 mode 参数的多个值之间不能相互冲突,比如 Append 和 Truncate 不能同时使用。

如果文件成功打开,open() 函数返回 true,否则返回 false。

2.读文件(Read)

当打开方式指定可以读文件的时候 从QIODevice继承下来的读文件公有方法:

qint64 read(char * data, qint64 maxSize)

以二进制的方式进行读取;将设备中maxSize字节读入数据保存在data中,并返回读取的字节数;当没有更多数据可供读取时,返回0;读过流的末尾为错误,返回-1 。

QByteArray read(qint64 maxSize)

从设备中读取maxSize字节,并将读取的数据作为QByteArray(字节数组)返回。

QByteArray readAll()

从设备读取所有可用数据,并将其作为QByteArray返回。

qint64 readLine(char * data, qint64 maxSize)

从设备中读取一行ASCII字符(最大为maxSize – 1字节),将字符存储在data中,并返回读取的字节数。如果一行不能被读取,但是没有错误发生,这个函数返回0。如果发生错误,将返回可读内容的长度,如果未读,则返回-1,结束的“\0”字节总是附加到数据中,因此maxSize必须大于1。

QByteArray readLine(qint64 maxSize = 0)

从设备中读取一行,但不超过maxSize字符,并以字节数组的形式返回结果。

使用完必须关闭流:QFile对象.close();

3.写文件(Write)

从QIODevice继承下来的写文件公有方法:

qint64 write(const char * data, qint64 maxSize)

将data提取maxSize字节数写到设备中(由于字体编码问题,中文字符为3个字节)。返回实际写入的字节数,如果发生错误则返回-1。

qint64 write(const char * data)

将以零结尾的8-bit字符串中的数据写入设备。返回实际写入的字节数,如果发生错误则返回-1。这等价于 QIODevice::write(data, qstrlen(data));

qint64 write(const QByteArray & byteArray)

将byteArray的内容写入设备。返回实际写入的字节数,如果发生错误则返回-1

4.QFile的公有成员函数

QFile除了构造函数外还有一些其它的公有成员函数哦!

(1)copy() :拷贝文件

bool QFile::copy(const QString & newName)

静态 bool QFile::copy(const QString & fileName, const QString & newName)

copy函数说明: 1.将当前指定的文件复制到名为newName的文件中。 2.如果成功返回true;否则返回false。 3.注意,如果一个名为newName的文件已经存在,copy()返回false(即QFile不会覆盖它)。 4.源文件在复制之前关闭 例子:

bool QFile::copy(const QString & newName) 的写法:

bool isSaveOK = file.copy(SavePath);

(2)exists() :判断文件存不存在

bool QFile::exists() const

静态 bool QFile::exists(const QString & fileName)

exists()函数说明: 1.如果fileName文件存在,则返回true;否则返回false。

(3)rename() :重命名文件

bool QFile::rename(const QString & newName)

静态 bool QFile::rename(const QString & oldName, const QString & newName)

rename说明: 1.将当前由fileName()指定的文件重命名为newName。如果成功返回true;否则返回false。 2.如果一个名为newName的文件已经存在,rename()返回false(即, QFile不会覆盖它)。 3.在重命名之前关闭文件。 4.如果重命名操作失败,Qt将尝试将该文件的内容复制到newName,然后删除该文件,只保留newName。 5.如果复制操作失败或无法删除此文件,则删除目标文件newName以恢复旧状态

(4)setFileName() :设置文件名称

void QFile::setFileName(const QString & name)

setFileName说明: 1.设置文件的名称。 2.名称可以没有路径、相对路径或绝对路径。 3.如果文件已经被打开,不要调用这个函数。 4.如果文件名没有路径或相对路径,则使用的路径将是open()调用时应用程序的当前目录路径。 5.注意,目录分隔符“/”适用于Qt支持的所有操作系统。

(5)link() :创建快捷方式

bool QFile::link(const QString & linkName)

静态 bool QFile::link(const QString & fileName, const QString & linkName)

link说明: 1.创建一个名为linkName的链接,该链接指向当前由fileName()指定的文件。 2.链接是什么取决于底层文件系统(可能是Windows上的快捷方式,也可能是Unix上的符号链接)。如果成功返回true;否则返回false。 3.此函数不会覆盖文件系统中已存在的实体;在这种情况下,link()将返回false,并将error()设置为返回RenameError。 4.注意:要在Windows上创建有效的链接,linkName必须有一个.lnk文件扩展名

(6)symLinkTarget() :获取快捷方式路径字符串

静态 QString QFile::symLinkTarget(const QString & fileName)

QString QFile::symLinkTarget() const

symLinkTarget说明: 1.返回文件名指定的符号链接(或Windows上的快捷方式)所引用的文件或目录的绝对路径,如果文件名不对应于符号链接,则返回空字符串。 2.此名称可能不表示现有文件;它只是一个字符串。 3.如果符号链接指向一个现有文件,则QFile::exists()返回true。

(6)size() :返回文件大小

qint64 QFile::size() const

size说明: 1.对于开放随机访问设备,此函数返回设备的大小。 2.对于打开的顺序设备,将返回bytesAvailable()。 3.如果设备关闭,返回的大小将不反映设备的实际大小。

三.代码示例

1. QFile 类读写文本文件的过程:

#include <QFile>

#include <QDebug>

int main(int argc, char *argv[])

{

    //创建 QFile 对象,同时指定要操作的文件

    QFile file("D:/demo.txt");

    //对文件进行写操作

    if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){

        qDebug()<<"文件打开失败";

    }

    //向文件中写入两行字符串

    file.write("C语言中文网\n");

    file.write("http://c.biancheng.net");

    //关闭文件

    file.close();

    //重新打开文件,对文件进行读操作

    if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){

        qDebug()<<"文件打开失败";

    }

    //每次都去文件中的一行,然后输出读取到的字符串

    char * str = new char[100];

    qint64 readNum = file.readLine(str,100);

    //当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取

    while((readNum !=0) && (readNum != -1)){

        qDebug() << str;

        readNum = file.readLine(str,100);

    }

    file.close();

    return 0;

}

执行程序,“C语言中文网” 和 “http://c.biancheng.net” 先写入 D 盘的 demo.txt 文件,然后再从文件中将它们读取出来。

2. QFile 读写二进制文件的过程

#include <QFile>

#include <QDebug>

int main(int argc, char *argv[])

{

    //指定要写入文件的数据

    qint32 nums[5]={1,2,3,4,5};

    //写入文件之前,要将数据以二进制方式存储到字节数组中

    QByteArray byteArr;

    byteArr.resize(sizeof(nums));

    for(int i=0;i<5;i++){

        //借助指针,将每个整数拷贝到字节数组中

        memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));

    }

    //将 byteArr 字节数组存储到文件中

    QFile file("D:/demo.dat");

    file.open(QIODevice::WriteOnly);

    file.write(byteArr);

    file.close();

    //再次打开文件,读取文件中存储的二进制数据

    file.open(QIODevice::ReadOnly);

    QByteArray resArr = file.readAll();

    //输出读取到的二进制数据

    qDebug()<<"resArr: "<<resArr;

    //将二进制数据转化为整数

    char* data = resArr.data();

    while(*data){

        qDebug() << *(qint32*)data;

        data += sizeof(qint32);

    }

    return 0;

}

执行程序,demo.dat 文件中会存储 {1,2,3,4,5} 这 5 个整数的二进制形式,同时输出以下内容:

resArr: “\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00”

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

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

相关文章

强化学习 - Trust Region Policy Optimization (TRPO)

什么是机器学习 Trust Region Policy Optimization&#xff08;TRPO&#xff09;是一种策略梯度方法&#xff0c;用于解决强化学习问题。TRPO旨在通过限制策略更新的大小&#xff0c;提高训练的稳定性。这样可以防止在参数空间中迅速迭代导致过大的更新&#xff0c;从而保持策…

LandrayOA内存调优 / JAVA内存调优 / Tomcat web.xml 超时时间调优实战

目录 一、背景说明 二、LandrayOA / Tomcat 内存调优 2.1 \win64\tomcat\conf\web.xml 文件调优 2.2 \win64\tomcat\bin\catalina64.bat 文件调优 一、背景说明 随着系统的使用时间越来越长&#xff0c;数据量越多&#xff0c;发现系统的有些功能越来越慢&…

基于InceptionV2/InceptionV3/Xception不同参数量级模型开发构建中草药图像识别分析系统,实验量化对比不同模型性能

最近正好项目中在做一些识别相关的内容&#xff0c;我也陆陆续续写了一些实验性质的博文用于对自己使用过的模型进行真实数据的评测对比分析&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、…

ubuntu 22 安装 node,npm,vue

1:安装 nodejs sudo apt update curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt update && sudo apt install -y nodejs node -v 2:安装npm sudo npm install n -g npm -v 3:安装vite npm install vite -g 4:运行vue 把项目拷贝到…

大语言应用技术原理

大模型应用技术原理 RAG 向量数据库 对比 选型标准 开源vs.闭源vs. 源码可见客户端/SDK语言托管方式 self-hosted/on-premise redis,pgvector,milvusmanaged/cloud-native zilliz,pineconeembeded+cloud-native chroma,lanceDBself-hosted+cloud-native vald,drant,weaviate,vs…

OpenAI正式推出GPT商店 ChatGPT团队订阅服务一并推出

2024年1月11日消息&#xff0c;据外媒报道&#xff0c;如上周在给开发者的邮件中所宣布的一样&#xff0c;因ChatGPT而名声大噪的人工智能公司OpenAI&#xff0c;在本周正式推出了GPT商店&#xff0c;供用户分享和发现个性化的ChatGPT&#xff0c;同时他们也推出了面向各种不同…

git 基础操作

由于最近svn停止使用&#xff0c;github或gitlab等费用较高&#xff0c;所以最近尝试在本地用 git 现在本地进行代码管理。现总结一下 git 常用的操作命令和本地repository的创建步骤。 git init //初始化git status //查看文件夹状态git add . //添加文…

用C语言实现贪吃蛇游戏!!!

前言 大家好呀&#xff0c;我是Humble&#xff0c;不知不觉在CSND分享自己学过的C语言知识已经有三个多月了&#xff0c;从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容&#xff0c;也希望这些内容可以帮助到各位正在阅读的小伙伴…

在 Redis 中使用 Lua 脚本执行复杂操作和事务

在 Redis 中使用 Lua 脚本执行复杂操作和事务 Redis 作为一个高性能的键值存储数据库&#xff0c;它的强大功能远不止于简单的数据存储和检索。Redis 自 2.6 版本起引入了对 Lua 脚本的支持&#xff0c;这意味着你可以在 Redis 服务器上直接运行 Lua 脚本。这一功能为执行复杂…

前端JavaScript篇之JavaScript 中如何进行隐式类型转换、加号(+)操作符什么时候用于字符串的拼接?为什么会有BigInt的提案?

目录 JavaScript 中如何进行隐式类型转换加法操作符&#xff08;&#xff09;比较操作符&#xff08;、>、<&#xff09;对象的隐式转换ToPrimitive 方法ToPrimitive 方法的作用ToPrimitive 方法的规则总结 加号&#xff08;&#xff09;操作符什么时候用于字符串的拼接&…

雨云VPS搭建PalWorld服务器,幻兽帕鲁开服联机教程(Windows),0基础保姆级教程

雨云VPS用Windows系统搭建幻兽帕鲁私服&#xff0c;PalWorld开服联机教程&#xff0c;零基础保姆级教程&#xff0c;本教程使用一键脚本来搭建幻兽帕鲁服务端&#xff0c;并讲了如何配置游戏参数&#xff0c;如何更新服务端等。 最近这游戏挺火&#xff0c;很多人想跟朋友联机…

实体关系抽取与属性补全的技术浅析

目录 前言1. 实体关系抽取2 实体关系抽取的方法2.1 基于模板的方法2.2 基于监督学习的关系抽取2.3 基于深度学习的关系抽取2.4 基于预训练语言模型的关系抽取 3 属性补全3.1 属性补全任务简介3.1 抽取式属性补全3.2 生成式属性补全 4 未来发展趋势结语 前言 在信息爆炸时代&am…

Python学习之路-Django基础:工程搭建

Python学习之路-Django基础:工程搭建 环境安装 创建虚拟环境 mkvirtualenv django_1.11.10 -p python3安装Django 使用Django 1.11.10版本 pip install django1.11.10创建工程 在使用Flask框架时&#xff0c;项目工程目录的组织与创建是需要我们自己手动创建完成的。在dj…

用甘特图有效管理多个项目进度

当公司或组织同时承担多个项目时,合理规划各项目的时间节点与资源分配对确保高效完成至关重要。采用甘特图可以直观地展示多个项目的时间进程、关键里程碑以及资源分配情况,便于从宏观层面全面把控各项目的动态。 在线甘特图软件 zz-plan.com 提供了非常强大的时间轴规划功能,支…

栈的基础知识

一、栈的定义与特点 栈&#xff1a;只能在表的一端&#xff08;栈顶&#xff09;进行插入和删除运算的线性表 逻辑结构 与线性表相同&#xff0c;仍为一对一关系 存储结构 用顺序栈和链栈存储均可&#xff0c;但顺序栈更常见 访问结点时依照后进先出&a…

漏洞复现-万户OA text2Html 任意文件读取(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

vue父子组件传值问题

在Vue中&#xff0c;父子组件之间的数据传递可以通过props和事件来实现。 使用props传递数据&#xff1a;父组件可以通过props将数据传递给子组件&#xff0c;子组件可以在模板中直接使用这些数据。父组件可以通过v-bind指令将数据绑定到子组件的props上。例如&#xff1a; v…

初识Cargo-Rust的包管理器

Cargo 是Rust的 包管理器。Cargo 会下载您Rust 的包依赖项&#xff0c;编译包&#xff0c;生成可分发的包&#xff0c;并将它们上传到crates.io - Rust 社区的包注册表。 安装的方法 安装 Rust 和 Cargo 获得 Cargo 的最简单方法是使用rustup脚本&#xff0c;获取当前稳定版本…

Cesium介绍及3DTiles数据加载时添加光照效果对比

一、Cesium简介 Cesium原意是化学元素铯&#xff0c;铯是制造原子钟的关键元素&#xff0c;通过命名强调了Cesium产品专注于基于时空数据的实时可视化应用。熟悉GIS开发领域的读者都知道&#xff0c;Cesium是一个用于创建3D地理空间应用程序的开源JavaScript库&#xff0c;它允…

《SPSS统计学基础与实证研究应用精解》视频讲解:数据缺失值处理

《SPSS统计学基础与实证研究应用精解》4.12 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解4.12节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会…