1  简介

参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=45

参考文档:《Qt教程.docx》

说明:本文主要介绍Qt的文件系统。

2  知识点

Qt通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图(Qt5):

l  QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;

QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。

QFlie:访问本地文件或者嵌入资源;

QTemporaryFile:创建和访问本地文件系统的临时文件;

QBuffer:读写QbyteArray, 内存文件;

QProcess:运行外部程序,处理进程间通讯;

QAbstractSocket:所有套接字类的父类;

QTcpSocket:TCP协议网络数据传输;

QUdpSocket:传输 UDP 报文;

QSslSocket:使用 SSL/TLS 传输数据;

3 基本文件操作

QFile提供了从文件中读取和写入数据的能力。

我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用setFileName()来修改。

QFile主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用QDataStream或QTextStream类来读写文件,也可以使用QIODevice类提供的read()、readLine()、readAll()以及write()这样的函数。

值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过QFileInfo获取,而不是自己分析文件路径字符串。

4  测试

(1)打开、读取、写入文件

功能:创建两个按钮,“read file”按钮打开一个文本框,读取文件的内容到textEdit;“save file”按钮将textEdit中的内容保存到一个文件中。界面如下:

读取文件使用到的函数和步骤:

1)创建一个文件对象:QFilefile(path);

2)以只读方式打开文件:boolisOk=file.open(QIODevice::ReadOnly);

3)读取文件的内容有多种方式,这里介绍两种:

一次性读取文件全部内容:QByteArrayarray=file.readAll();

一次只读取一行:

  1. QByteArray array;
  2. while (file.atEnd() == false) {
  3. //读一行
  4. array += file.readLine();
  5. }

4)关闭文件:file.close();

写入文件用到的函数和步骤:

1)创建文件对象:QFile file;

2)关联文件名字:file.setFileName(path);

3)以只写方式打开文件:bool isOK = file.open(QIODevice::WriteOnly);

4)向文件中写入内容:file.write(str);

5)关闭文件:file.close();

完整代码:

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QFile>
  4. #include <QFileDialog>
  5. #include <QByteArray>
  6. #include <QByteArray>
  7.  
  8. Widget::Widget(QWidget *parent) :
  9. QWidget(parent),
  10. ui(new Ui::Widget)
  11. {
  12. ui->setupUi(this);
  13. }
  14.  
  15. Widget::~Widget()
  16. {
  17. delete ui;
  18. }
  19.  
  20. void Widget::on_pushButton_read_clicked()
  21. {
  22. QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)");
  23. if (path.isEmpty() == false) {
  24. QFile file(path); //文件对象
  25. bool isOK = file.open(QIODevice::ReadOnly); //打开文件
  26. if (true == isOK) {
  27. //一行一行读取文件
  28. QByteArray array;
  29. while (file.atEnd() == false) {
  30. array += file.readLine();
  31. }
  32. ui->textEdit->setText(array);
  33. file.close();
  34. }
  35. }
  36. }
  37.  
  38. void Widget::on_pushButton_save_clicked()
  39. {
  40. QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)");
  41. if (path.isEmpty() == false) {
  42. QFile file(path); //文件对象
  43. bool isOK = file.open(QIODevice::WriteOnly); //打开文件
  44. if (true == isOK) {
  45. //获取文本编辑区的内容
  46. QString str = ui->textEdit->toPlainText();
  47. //转换为本地编码写入
  48. file.write(str.toLocal8Bit());
  49. file.close();
  50. }
  51. }
  52. }

运行测试:

上述代码中,打开文件使用的是系统默认的编码格式:UTF-8,如果打开其它编码格式的文件就会乱码。

(2)获取文件信息

比如获取文件的名字、文件后缀、文件大小、文件创建时间等信息。

通过QFileInfo类来实现的。这个很简单,直接给出测试代码:

  1. Widget::Widget(QWidget *parent) :
  2. QWidget(parent),
  3. ui(new Ui::Widget)
  4. {
  5. ui->setupUi(this);
  6.  
  7. QFileInfo info("../demo.txt");
  8. qDebug() << "文件名字" << info.fileName().toUtf8().data();
  9. qDebug() << "文件后缀" << info.suffix();
  10. qDebug() << "文件大小" << info.size();
  11. qDebug() << "文件创建时间" << info.created().toString("yyyy-MM-dd hh:mm:ss");
  12. qDebug() << "文件路径" << info.filePath();
  13. }

(3)QDataStream读写文件

QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。

QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。

测试代码:创建两个函数,writeData()写文件,readData()读文件。

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QDataStream>
  4. #include <QFile>
  5. #include <QDebug>
  6.  
  7. #define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"
  8.  
  9. Widget::Widget(QWidget *parent) :
  10. QWidget(parent),
  11. ui(new Ui::Widget)
  12. {
  13. ui->setupUi(this);
  14.  
  15. writeData();
  16. readData();
  17. }
  18.  
  19. Widget::~Widget()
  20. {
  21. delete ui;
  22. }
  23.  
  24. void Widget::writeData()
  25. {
  26. //创建文件对象
  27. QFile file("../text.txt");
  28. //打开文件,只写方式
  29. bool isOK = file.open(QIODevice::WriteOnly);
  30. if (true == isOK) {
  31. //创建数据流,和file文件关联
  32. //往数据流中写数据,相当于往文件里写数据(二进制)
  33. QDataStream stream(&file);
  34. stream << QString("主要看气质") << ;
  35. file.close();
  36. }
  37. }
  38.  
  39. void Widget::readData()
  40. {
  41. //创建文件对象
  42. QFile file("../text.txt");
  43. //打开文件,只读方式
  44. bool isOK = file.open(QIODevice::ReadOnly);
  45. if (true == isOK) {
  46. //创建数据流,和file文件关联
  47. //从数据流中读数据,相当于从文件里读数据(二进制)
  48. QDataStream stream(&file);
  49. //读的时候,按写的顺序取数据
  50. QString str;
  51. int a;
  52. stream >> str >> a;
  53. cout << str << a;
  54. file.close();
  55. }
  56. }

运行测试:

打印输出:[ ..\file_2\widget.cpp : 54 ] "主要看气质" 250

我们打开text.txt文件,会看到是乱码的,因为是二进制文件。

(4)QTextStream读写文件

QTextStream是操作纯文本文件的。QTextStream会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。

QTextStream使用 16 位的QChar作为基础的数据存储单位,同样,它也支持 C++ 标准类型,如 int 等。实际上,这是将这种标准类型与字符串进行了相互转换。

测试代码:

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QFile>
  4. #include <QTextStream>
  5. #include <QDebug>
  6. #include <QFileDialog>
  7.  
  8. #define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"
  9.  
  10. Widget::Widget(QWidget *parent) :
  11. QWidget(parent),
  12. ui(new Ui::Widget)
  13. {
  14. ui->setupUi(this);
  15.  
  16. writeData();
  17. readData();
  18. }
  19.  
  20. Widget::~Widget()
  21. {
  22. delete ui;
  23. }
  24.  
  25. void Widget::writeData()
  26. {
  27. QFile file;
  28. file.setFileName("../demo.txt");
  29. bool isOK = file.open(QIODevice::WriteOnly);
  30. if (true == isOK) {
  31. QTextStream stream(&file);
  32. //指定编码
  33. stream.setCodec("UTF-8");
  34. stream << QString("主要看气质") << ;
  35. file.close();
  36. }
  37. }
  38.  
  39. void Widget::readData()
  40. {
  41. QFile file;
  42. file.setFileName("../demo.txt");
  43. bool isOK = file.open(QIODevice::ReadOnly);
  44. if (true == isOK) {
  45. QTextStream stream(&file);
  46. stream.setCodec("UTF-8");
  47. //读取出来的就是字符串
  48. QString str = stream.readAll();
  49. cout << str;
  50. file.close();
  51. }
  52. }

运行测试:

打印输出:[ ..\file_3\widget.cpp : 53 ] "主要看气质250"

打开demo.txt文件,可以发现文件是可读的,不会乱码。

Qt-文件系统的更多相关文章

  1. qt-5.6.0 移植之qt文件系统的建立

    经过差不多两个星期的奋斗,终于在板子里面跑起来了qt 程序,虽然现在还没有把触摸屏驱动加上去,但是我相信已经不远了!!!!! 在前两篇的随笔里面 , 已经编译好了最纯净的文件系统以及交叉编译完成了qt ...

  2. Qt文件系统之QFile

    QFile文件操作 文件打开方式: QIODevice::NotOpen    0x0000   设备不打开.QIODevice::ReadOnly    0x0001   设备 以只读的方式打开.Q ...

  3. 嵌入式开发 迅为4418开发板Qt移植移动4G模块第一部分

    本文转自迅为论坛:http://topeetboard.com 了解更多:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-7744162139 ...

  4. [转载]迅为4418开发板Qt移植移动4G模块第一部分

        本文转自迅为论坛:http://topeetboard.com   平台:iTOP-4418开发板   1.首先要配置内核,这个一步和Android系统移植3G或者4G模块是一样的.一般模块的 ...

  5. Linux-QT 开发环境搭建以及编译镜像

    搭建Linux-QT 开发环境,需要先搭建Android 的编译环境,然后在Android 编译环境的基础上,再搭建Linux-QT 编译环境. 第一:编译器. 第二:设置环境变量.环境变量设置后,编 ...

  6. Linux USB摄像头驱动【转】

    本文转载自:http://www.itdadao.com/articles/c15a509940p0.html 在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 ...

  7. 手把手教你从头开始搭建友善之臂ARM-tiny4412开发环境(史上最详细!!)

    创建一个ARM目录 mkdir   /disk/A9  -p 接下来你需要准备以下的东西 1.arm-linux-gcc-4.5.1     交叉编译器 2.linux-3.5-tiny4412    ...

  8. Linux USB 摄像头驱动

    在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 USB 接口的摄像头.这一章主要是介绍 USB 摄像头的设备驱动程序.在我们印象中,驱动程序都是一个萝卜一个坑, ...

  9. 4412 搭建和测试NFS服务器

    一.NFS网络文件系统 NFS是Network FileSystem的缩写,NFS是基于UDP/IP协议的应用.它的最大功能就是可以通过网络让不同的机器,不通的操作系统彼此共享文件, 可以通过NFS挂 ...

  10. IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像

    搭建 Qtopia2.2.0 开发环境,需要先搭建 Android 的编译环境,然后在 Android 编译环境的基础上,再搭建 Qtopia2.2.0 编译环境.以下内容基于迅为-iMX6开发板.Q ...

随机推荐

  1. 源码分析(5)-ArrayList、Vector和LinkedList(JDK1.8)

    一.概述 1.线程安全:ArrayList和LinkedList非线程安全的.Vector线程安全的. 2.底层数据结构:ArrayList和Vector底层数据结构是数组:LinkedList双向链 ...

  2. HttpUtil工具类,发送Get/Post请求,支持Http和Https协议

    HttpUtil工具类,发送Get/Post请求,支持Http和Https协议 使用用Httpclient封装的HttpUtil工具类,发送Get/Post请求 1. maven引入httpclien ...

  3. 实验五shell脚本编程

    项目 内容 这个作业属于哪个课程 <班级课程的主页链接> 这个作业的要求在哪里 作业要求链接地址 学号-姓名 17043220-万文文 作业学习目标 1)了解shell脚本的概念及使用.2 ...

  4. Yii2.0ActiveRecord嵌套子查询(AR子查询)

    yii2.0的ActiveRecord是可以嵌套子查询的. 比如从一个子查询里面筛选数据. 首先实例化出来一个Query对象,代表子查询. $subQuery = new \yii\db\Query( ...

  5. Mybatis一对多或多对多只能查出一条数据解决策略

    原文:https://blog.csdn.net/ren814/article/details/81742242 <resultMap id="menuModelMap" t ...

  6. 从零开始的Spring Boot(6、Thymeleaf内置对象及表达式大全)

    1.1 基础对象 #ctx:上下文对象 ${#ctx.locale} ${#ctx.variableNames} ${#ctx.request} ${#ctx.response} ${#ctx.ses ...

  7. 这一次搞懂Spring的XML解析原理

    前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规 ...

  8. .Net微服务实战之DevOps篇

    技术只是基础 该系列的两篇文章<.Net微服务实战之技术选型篇>和<.Net微服务实战之技术架构分层篇>都是以技术角度出发描述微服务架构的实施. 如果技术选型篇叙述的是工具,那 ...

  9. C#基础——IO

    最近一直忙着做项目,偶尔会碰到一些文件读写方面的需求,当我回忆读写的代码时,发现脑子里存在诸多空白.这是不妙的,于是连忙翻出以前记下的笔记,上面还存在着我当初写下的知识点.怕以后哪天笔记找不到了或者有 ...

  10. 【SEED Labs】DNS Rebinding Attack Lab

    Lab Overview 实验环境下载:https://seedsecuritylabs.org/Labs_16.04/Networking/DNS_Rebinding/ 在这个实验中模拟的物联网设备 ...