导读: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. hadoop2.7.3+spark2.0.1+scala2.11.8集群部署

    一.环境 4.用户 hadoop 5.目录规划 /home/hadoop/app    #程序目录 /home/hadoop/data  #数据目录     #打开文件的最大数 vi /etc/sec ...

  2. IDEA 2020.1.2,IDEA 2020.1.3永久破解(持续更新)

    1. 本教程适用于 IntelliJ IDEA 2020.1.3 以下所有版本,请放心食用~2. 本教程适用于 JetBrains 全系列产品,包括 IDEA. Pycharm.WebStorm.Ph ...

  3. CSV文件指定页脚

    https://www.cnblogs.com/zhangxinqi/p/9231801.html 2020-06-15

  4. Button基本用语

    1.self.btn2 = Button(root,image = photo,command = self.login) 使用 image 图片作为按钮,command 作为响应 2.self.bt ...

  5. 5.19 省选模拟赛 T1 小B的棋盘 双指针 性质

    LINK:小B的棋盘 考试的时候没有认真的思考 导致没做出来. 容易发现 当k>=n的时候存在无限解 其余都存在有限解 对于30分 容易想到暴力枚举 对称中心 然后 n^2判断. 对于前者 容易 ...

  6. mit-6.828 Lab Tools

    Lab Tools 目录 Lab Tools 写在前面 GDB GNU GPL (通用公共许可证) QEMU ELF 可执行文件的格式 Verbose mode Makefile 写在前面 操作系统小 ...

  7. 通过MyBatis操作数据库

    MyBatis是一款优秀的持久层框架,同样也是做OR Mapping的.与JPA不同,MyBatis里面需要我们自己来定制sql. MyBatis和JPA的选择 其实如果业务比较操作比较简单使用JPA ...

  8. MySQL-安装配置篇

    一.MySQL二进制安装包安装 1.环境初始化 1)创建目录mkdir /app/database --安装路径 mkdir /data/3306 --存放数据路径 mkdir /binlog/330 ...

  9. cryptopp使用Qt mingw编译,以及海思平台交叉编译

    编译工程生成,使用qmake生成qt工程文件(海思平台时,要用海思平台的qmake),将 TEMPLATE = app 修改为: TEMPLATE = lib 添加如下: win32:LIBS += ...

  10. 基于boost的bind与function的一个简单示例消息处理框架

    前两年开始接触boost,boost库真是博大精深:今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了. 上次文发了一 ...