导读: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信号与槽使用方法最完整总结

C++最好的图形库是什么?

Linux快速搭建C/C++开发环境

获取知识干货、增加面试经验、了解职场人生

欢迎关注微信公众号

一篇文章快速搞懂Qt文件读写操作的更多相关文章

  1. 一篇文章快速搞懂什么是GitHub

    导读:什么是GitHub?Git与GitHub之间是什么关系?我们为什么需要版本控制系统?GitHub如何使用?本文将带你一探究竟. 本文字数:1710,阅读时长大约:13分钟 一.什么是版本控制 按 ...

  2. 一篇文章快速搞懂 Apache SkyWalking 的 OAL

    OAL简介 在流模式(Streaming mode)下,SkyWalking 提供了 观测分析语言(Observability Analysis Language,OAL) 来分析流入的数据. OAL ...

  3. 一篇文章快速搞懂Redis的慢查询分析

    什么是慢查询? 慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程: 发送命令 命令排队 命令执行 返回结果 在慢查询的定义中,统计比较慢的时间段指的 ...

  4. 一篇文章快速搞懂 Atomic(原子整数/CAS/ABA/原子引用/原子数组/LongAdder)

    前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized,还有另一大分支Atomic.如果大家没听过没用过先看基础篇,如果听过用过,请滑至底部看进阶篇,深入 ...

  5. 一篇搞懂python文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)

           关于文件操作的几种常用方式,网上已有很多解说,内容很丰富,但也因此有些杂乱复杂.今天,我就以我个人的学习经验写一篇详细又易懂的总结文章,希望大家看完之后会有所收获. 一.核心功能 ‘r’ ...

  6. 一篇文章彻底搞懂base64编码原理

    开始 在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇文章带领大家了解一下Base64的底层实现. base64是什么东东呢? Base64 ...

  7. Qt文件读写操作

    原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html QFile Class 1.read读文件 加载文件对象  QFile file(&qu ...

  8. 一篇文章彻底搞懂异步,同步,setTimeout,Promise,async

    之前翻看别的大佬的博客看到了关于setTimeout,promise还有async执行顺序的文章.观看了几篇之后还是没有怎么看懂,于是自己开始分析代码,并整理了此文章,我相信通过此文章朋友们能对异步同 ...

  9. 一篇文章彻底搞懂Java的大Class到底是什么

    作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用. 因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 ...

随机推荐

  1. Python 图像处理 OpenCV (15):图像轮廓

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  2. 火车进栈(进出栈的模拟,dfs爆搜)

    这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头. 这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从 ...

  3. gerrit安装指南

    Gerrit的基本介绍 Gerrit 是一个Git服务器,它基于 git 版本控制系统,使用网页界面来进行审阅工作.Gerrit 旨在提供一个轻量级框架,用于在代码入库之前对每个提交进行审阅,更改将上 ...

  4. PHP money_format() 函数

    实例 en_US 国际格式: <?php高佣联盟 www.cgewang.com$number = 1234.56;setlocale(LC_MONETARY,"en_US" ...

  5. SpringClould进行Devtools热部署

    当我们在使用SpringCloud搭建项目的时候,会有多个项目,每次修改东西的时候,都需要重新启动项目,这样的操作就比较繁琐. 为了提高工作的效率,避免每次频繁的重启项目,在子类pom文件中,我们可以 ...

  6. loj #6247. 九个太阳 k次单位根 神仙构造 FFT求和原理

    LINK:九个太阳 不可做系列. 构造比较神仙. 考虑FFT的求和原理有 \(\frac{1}{k}\sum_{j=0}^{k-1}(w_k^j)^n=[k|n]\) 带入这道题的式子. 有\(\su ...

  7. luogu P2510 [HAOI2008]下落的圆盘

    LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...

  8. SpringBoot之多模块项目

    SpringBoot之多模块项目 说明:我们通过maven的父子工程来搭建springboot的多模块项目** 项目的整体结构 本项目涉及了到了五个模块 framework-web模块主要是放置前端的 ...

  9. 【NOI2017】游戏 题解(2-SAT+缩点)

    题目链接 题目大意:有四种场地$a,b,c,x$和三种赛车$A,B,C$,$a$不能跑$A$,$b$不能跑$B$,$c$不能跑$C$,$x$都可以跑.给定$n$个场地和$m$个四元组$(i,h_i,j ...

  10. 银弹谷零代码开发V百科|使用技巧:你已经是个成熟的系统了,该学会无网络升级了

    银弹谷零代码开发V百科|使用技巧:你已经是个成熟的系统了,该学会无网络升级了 伴随网络时代的发展,当今越来越多用户家庭的日常生活已经离不开网络.它就像是一张巨大的蛛网,连接起我们每一户人家.虽然网络不 ...