一篇文章快速搞懂Qt文件读写操作
导读:Qt当中使用QFile类对文件进行读写操作,对文本文件也可以与QTextStream一起使用,这样读写操作会更加简便。QFileInfo可以用来获取文件的信息。QDir可以用于对文件夹进行操作。
本文字数:1000,阅读时长大约:10分钟
一、文件读操作
(1)使用QFile类
Qt封装了QFile类,方便我们对文件进行操作,可以按照如下的步骤进行:
- 使用QFile加载文件对象
- 打开文件 file.open(打开方式)
- 操作文件
- 关闭文件 file.close()
使用QFile首先用只读方式打开一个文本文件,然后用readAll()方法将文件内容一次全部读取出来,返回值是字节数组QByteArray。QByteArray用来存放二进制数据,如果想要看文字内容需要转换成QString。
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\");
QFile file(path);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return;
} QByteArray allArray = file.readAll();
QString allStr = QString(allArray);
file.close();
Qt默认使用utf-8的编码方式,在Linux中一般没有问题,因为Linux默认也是用utf-8。不过Windows里一般用的是gb18030,所以除非我们明确将文件保存成utf-8编码,否则在Qt代码里需要对编码做一些转换操作:
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\");
QFile file(path);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return;
} QByteArray allArray = file.readAll();
QTextCodec *codec = QTextCodec::codecForName("gb18030");
QString allStr = codec->toUnicode(allArray);
file.close();
我们也可以使用readLine方法一次读取一行,然后每次对一行文字进行操作:
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\");
QFile file(path);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return;
} while(!file.atEnd())
{
QByteArray array = file.readLine();
QString str = QString(array);
}
file.close();
(2)使用QTextStream类
如果操作的是文本文件,Qt还专门封装了一个处理文本流的类,我们可以一行一行的读取文本内容
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\");
QFile file(path);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return;
} QTextStream in(&file);
//in.setCodec("utf-8");
while (!in.atEnd())
{
QString line = in.readLine();
}
file.close();
二、文件写操作
(1)使用QFile类
使用QFile同样可以对文件进行写操作:
QString path = QFileDialog::getSaveFileName(this, "保存"
, "D:\\temp\\", "TXT(*.txt)");
QFile file(path);
file.open(QIODevice::WriteOnly | QIODevice::Text);
file.write("你好");
file.close();
(2)使用QTextStream类
QTextStream类对操作符进行了重载,我们可以通过 << 操作符将字符串流入文本文件:
QString path = QFileDialog::getSaveFileName(this, "保存"
, "D:\\temp\\", "TXT(*.txt)");
QFile file(path);
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
QString str = "你好";
out << str;
file.close();
三、文件信息读取
除了对文件的读写操作,Qt还封装了QFileInfo类帮助我们获取文件的元数据,比如文件大小、后缀名、创建时间、最后修改时间等等:
QString path = QFileDialog::getOpenFileName(this, "打开文件", "D:\\temp\\");
QFileInfo file(path);
qDebug() << "文件名" << file.fileName();
qDebug() << "后缀名" << file.suffix();
qDebug() << "文件大小" << file.size();
qDebug() << "创建日期" << file.birthTime().toString("yyyy/MM/dd hh:mm:ss");
qDebug() << "最后修改" << file.lastModified().toString("yyyy/MM/dd hh:mm:ss");
四、文件夹的操作
QDir类可以对路径/文件夹/目录进行操作(不同的系统有不同的名称)。首先我们可以用QDir表示绝对路径,比如:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
也可以表示相对路径,比如:
QDir("images/landscape.png")
我们可以用IsRelative()和IsAbsolute()方法来检验某个QDir对象使用的是绝对路径还是相对路径。不管用的是哪一种,两者之间也可以相互转化:
QDir directory("Documents/Letters");
QString path = directory.filePath("contents.txt");
QString absolutePath = directory.absoluteFilePath("contents.txt");
我们经常用到QDir的例子有比如检查某个路径是否存在:
QDir dir("example");
if (!dir.exists())
{
qWarning("Cannot find the example directory");
}
或者查找某个路径下的文件:
QDir dir = QDir::root(); // "/"
if (!dir.cd("tmp")) // "/tmp"
{
qWarning("Cannot find the \"/tmp\" directory");
}
else
{
QFile file(dir.filePath("ex1.txt")); // "/tmp/ex1.txt"
if (!file.open(QIODevice::ReadWrite))
{
qWarning("Cannot create the file");
}
}
五、文件夹的操作
Qt对文件和文件夹的操作封装了很多类,比如对文件操作可以使用QFile,文本文件的读写可以使用QTextStream,读取文件元数据可以使用QFileInfo,文件夹的操作可以使用QDir等。这些类为开发者提供了极大的便利,还有很多方法本文不能一一介绍到,感兴趣的读者也可以查阅Qt的帮助文档。
推荐阅读:
获取知识干货、增加面试经验、了解职场人生
欢迎关注微信公众号
一篇文章快速搞懂Qt文件读写操作的更多相关文章
- 一篇文章快速搞懂什么是GitHub
导读:什么是GitHub?Git与GitHub之间是什么关系?我们为什么需要版本控制系统?GitHub如何使用?本文将带你一探究竟. 本文字数:1710,阅读时长大约:13分钟 一.什么是版本控制 按 ...
- 一篇文章快速搞懂 Apache SkyWalking 的 OAL
OAL简介 在流模式(Streaming mode)下,SkyWalking 提供了 观测分析语言(Observability Analysis Language,OAL) 来分析流入的数据. OAL ...
- 一篇文章快速搞懂Redis的慢查询分析
什么是慢查询? 慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程: 发送命令 命令排队 命令执行 返回结果 在慢查询的定义中,统计比较慢的时间段指的 ...
- 一篇文章快速搞懂 Atomic(原子整数/CAS/ABA/原子引用/原子数组/LongAdder)
前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized,还有另一大分支Atomic.如果大家没听过没用过先看基础篇,如果听过用过,请滑至底部看进阶篇,深入 ...
- 一篇搞懂python文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)
关于文件操作的几种常用方式,网上已有很多解说,内容很丰富,但也因此有些杂乱复杂.今天,我就以我个人的学习经验写一篇详细又易懂的总结文章,希望大家看完之后会有所收获. 一.核心功能 ‘r’ ...
- 一篇文章彻底搞懂base64编码原理
开始 在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇文章带领大家了解一下Base64的底层实现. base64是什么东东呢? Base64 ...
- Qt文件读写操作
原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html QFile Class 1.read读文件 加载文件对象 QFile file(&qu ...
- 一篇文章彻底搞懂异步,同步,setTimeout,Promise,async
之前翻看别的大佬的博客看到了关于setTimeout,promise还有async执行顺序的文章.观看了几篇之后还是没有怎么看懂,于是自己开始分析代码,并整理了此文章,我相信通过此文章朋友们能对异步同 ...
- 一篇文章彻底搞懂Java的大Class到底是什么
作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用. 因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 ...
随机推荐
- bootstrap插件-滚动监听
代码 引入bootstrap.js 和bootstrap.css两个文件 <!DOCTYPE html> <html> <head> <meta charse ...
- Python List list()方法
描述 list() 方法用于将元组转换为列表.高佣联盟 www.cgewang.com 注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中. 语法 list ...
- PHP max() 函数
实例 通过 max() 函数查找最大值: <?phpecho(max(2,4,6,8,10) . "<br>");echo(max(22,14,68,18,15) ...
- PHP pack() 函数
实例 把数据装入一个二进制字符串: <?phpecho pack("C3",80,72,80);?>高佣联盟 www.cgewang.com 定义和用法 pack() ...
- PHP hex2bin() 函数
实例 把十六进制值转换为 ASCII 字符: <?phpecho hex2bin("48656c6c6f20576f726c6421");?> 以上实例输出结果: He ...
- ZROI 提高十连测 DAY3
由于我不太会写 觉得从比赛开始就冷静分析.然后看完三道题心态有点爆炸没有紧扣题目的性质. 这个心态是不可取的尽量不要有畏难心理 不要草草的写暴力. LINK:[最长01子序列](http://zhen ...
- 【FZYZOJ】珂神不等式&平角咖啡厅 题解(二分答案)
前言:这题太神了,蒟蒻表示思路完全断档,甚至想到DP.得到大佬hs-black的帮助后才AC此题orz --------------------------------- 题目描述 ck love…… ...
- 企业签名和TF签名哪个好?TF签名和企业签名怎么选?
很多开发者在App无法上架Appstore,需要内测或者开放给苹果用户使用的时候,需要选择企业签名来帮助自己的App开放下载链接,给苹果用户使用.苹果企业签名的类型有很多,TF签名最近又很火爆,那么企 ...
- 微信小程序开发着工具获取和更新newticket
newticket是微信开发者工具和微信后台交互的凭证.大多数工具的操作都是需要newticket. 如何获取newticket? 打开开发者工具,依次点击菜单设置->通用设置->代理,使 ...
- C++实现哈夫曼编码/译码器(数据结构)
设计一个哈夫曼编码.译码系统.对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件:反过来,可将编码文件译码还原为一个文本文件.(1) 从文件中读入任意一篇英文短文(文件为ASCII编码 ...