Qt-文件系统
1 简介
参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=45
参考文档:《Qt教程.docx》
说明:本文主要介绍Qt的文件系统。
2 知识点
Qt通过QIODevice提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。下面是 I/O 设备的类图(Qt5):

l QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
l QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。
l QFlie:访问本地文件或者嵌入资源;
l QTemporaryFile:创建和访问本地文件系统的临时文件;
l QBuffer:读写QbyteArray, 内存文件;
l QProcess:运行外部程序,处理进程间通讯;
l QAbstractSocket:所有套接字类的父类;
l QTcpSocket:TCP协议网络数据传输;
l QUdpSocket:传输 UDP 报文;
l 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();
一次只读取一行:
QByteArray array;
while (file.atEnd() == false) {
//读一行
array += file.readLine();
}
4)关闭文件:file.close();
写入文件用到的函数和步骤:
1)创建文件对象:QFile file;
2)关联文件名字:file.setFileName(path);
3)以只写方式打开文件:bool isOK = file.open(QIODevice::WriteOnly);
4)向文件中写入内容:file.write(str);
5)关闭文件:file.close();
完整代码:

#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QFileDialog>
#include <QByteArray>
#include <QByteArray> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
} Widget::~Widget()
{
delete ui;
} void Widget::on_pushButton_read_clicked()
{
QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)");
if (path.isEmpty() == false) {
QFile file(path); //文件对象
bool isOK = file.open(QIODevice::ReadOnly); //打开文件
if (true == isOK) {
//一行一行读取文件
QByteArray array;
while (file.atEnd() == false) {
array += file.readLine();
}
ui->textEdit->setText(array);
file.close();
}
}
} void Widget::on_pushButton_save_clicked()
{
QString path = QFileDialog::getOpenFileName(this, "open", "../", "TXT(*.txt)");
if (path.isEmpty() == false) {
QFile file(path); //文件对象
bool isOK = file.open(QIODevice::WriteOnly); //打开文件
if (true == isOK) {
//获取文本编辑区的内容
QString str = ui->textEdit->toPlainText();
//转换为本地编码写入
file.write(str.toLocal8Bit());
file.close();
}
}
}
运行测试:

上述代码中,打开文件使用的是系统默认的编码格式:UTF-8,如果打开其它编码格式的文件就会乱码。
(2)获取文件信息
比如获取文件的名字、文件后缀、文件大小、文件创建时间等信息。
通过QFileInfo类来实现的。这个很简单,直接给出测试代码:

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); QFileInfo info("../demo.txt");
qDebug() << "文件名字" << info.fileName().toUtf8().data();
qDebug() << "文件后缀" << info.suffix();
qDebug() << "文件大小" << info.size();
qDebug() << "文件创建时间" << info.created().toString("yyyy-MM-dd hh:mm:ss");
qDebug() << "文件路径" << info.filePath();
}
(3)QDataStream读写文件
QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。
QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。
测试代码:创建两个函数,writeData()写文件,readData()读文件。

#include "widget.h"
#include "ui_widget.h"
#include <QDataStream>
#include <QFile>
#include <QDebug> #define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]" Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); writeData();
readData();
} Widget::~Widget()
{
delete ui;
} void Widget::writeData()
{
//创建文件对象
QFile file("../text.txt");
//打开文件,只写方式
bool isOK = file.open(QIODevice::WriteOnly);
if (true == isOK) {
//创建数据流,和file文件关联
//往数据流中写数据,相当于往文件里写数据(二进制)
QDataStream stream(&file);
stream << QString("主要看气质") << ;
file.close();
}
} void Widget::readData()
{
//创建文件对象
QFile file("../text.txt");
//打开文件,只读方式
bool isOK = file.open(QIODevice::ReadOnly);
if (true == isOK) {
//创建数据流,和file文件关联
//从数据流中读数据,相当于从文件里读数据(二进制)
QDataStream stream(&file);
//读的时候,按写的顺序取数据
QString str;
int a;
stream >> str >> a;
cout << str << a;
file.close();
}
}
运行测试:
打印输出:[ ..\file_2\widget.cpp : 54 ] "主要看气质" 250
我们打开text.txt文件,会看到是乱码的,因为是二进制文件。
(4)QTextStream读写文件
QTextStream是操作纯文本文件的。QTextStream会自动将 Unicode 编码同操作系统的编码进行转换,这一操作对开发人员是透明的。它也会将换行符进行转换,同样不需要自己处理。
QTextStream使用 16 位的QChar作为基础的数据存储单位,同样,它也支持 C++ 标准类型,如 int 等。实际上,这是将这种标准类型与字符串进行了相互转换。
测试代码:

#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QFileDialog> #define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]" Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); writeData();
readData();
} Widget::~Widget()
{
delete ui;
} void Widget::writeData()
{
QFile file;
file.setFileName("../demo.txt");
bool isOK = file.open(QIODevice::WriteOnly);
if (true == isOK) {
QTextStream stream(&file);
//指定编码
stream.setCodec("UTF-8");
stream << QString("主要看气质") << ;
file.close();
}
} void Widget::readData()
{
QFile file;
file.setFileName("../demo.txt");
bool isOK = file.open(QIODevice::ReadOnly);
if (true == isOK) {
QTextStream stream(&file);
stream.setCodec("UTF-8");
//读取出来的就是字符串
QString str = stream.readAll();
cout << str;
file.close();
}
}
运行测试:
打印输出:[ ..\file_3\widget.cpp : 53 ] "主要看气质250"
打开demo.txt文件,可以发现文件是可读的,不会乱码。
Qt-文件系统的更多相关文章
- qt-5.6.0 移植之qt文件系统的建立
经过差不多两个星期的奋斗,终于在板子里面跑起来了qt 程序,虽然现在还没有把触摸屏驱动加上去,但是我相信已经不远了!!!!! 在前两篇的随笔里面 , 已经编译好了最纯净的文件系统以及交叉编译完成了qt ...
- Qt文件系统之QFile
QFile文件操作 文件打开方式: QIODevice::NotOpen 0x0000 设备不打开.QIODevice::ReadOnly 0x0001 设备 以只读的方式打开.Q ...
- 嵌入式开发 迅为4418开发板Qt移植移动4G模块第一部分
本文转自迅为论坛:http://topeetboard.com 了解更多:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-7744162139 ...
- [转载]迅为4418开发板Qt移植移动4G模块第一部分
本文转自迅为论坛:http://topeetboard.com 平台:iTOP-4418开发板 1.首先要配置内核,这个一步和Android系统移植3G或者4G模块是一样的.一般模块的 ...
- Linux-QT 开发环境搭建以及编译镜像
搭建Linux-QT 开发环境,需要先搭建Android 的编译环境,然后在Android 编译环境的基础上,再搭建Linux-QT 编译环境. 第一:编译器. 第二:设置环境变量.环境变量设置后,编 ...
- Linux USB摄像头驱动【转】
本文转载自:http://www.itdadao.com/articles/c15a509940p0.html 在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 ...
- 手把手教你从头开始搭建友善之臂ARM-tiny4412开发环境(史上最详细!!)
创建一个ARM目录 mkdir /disk/A9 -p 接下来你需要准备以下的东西 1.arm-linux-gcc-4.5.1 交叉编译器 2.linux-3.5-tiny4412 ...
- Linux USB 摄像头驱动
在 cortex-a8 中,可接入摄像头的接口通常可以分为两种, CAMERA 接口和 USB 接口的摄像头.这一章主要是介绍 USB 摄像头的设备驱动程序.在我们印象中,驱动程序都是一个萝卜一个坑, ...
- 4412 搭建和测试NFS服务器
一.NFS网络文件系统 NFS是Network FileSystem的缩写,NFS是基于UDP/IP协议的应用.它的最大功能就是可以通过网络让不同的机器,不通的操作系统彼此共享文件, 可以通过NFS挂 ...
- IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像
搭建 Qtopia2.2.0 开发环境,需要先搭建 Android 的编译环境,然后在 Android 编译环境的基础上,再搭建 Qtopia2.2.0 编译环境.以下内容基于迅为-iMX6开发板.Q ...
随机推荐
- Jmeter(九) - 从入门到精通 - JMeter逻辑控制器 - 上篇(详解教程)
1.简介 Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”. 意思 ...
- scws中文分词安装和使用
一.下载源码 wget http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 tar xvjf scws-1.2.3.tar.bz2 二.执行配置 ...
- fopen函数中的mode参数
fopen FILE * fopen ( const char * filename, const char * mode ); 其中,参数mode可取以下值: "r"read: ...
- [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和
题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...
- (八)slf4j+logback 的配置与使用
logback的配置看这篇:https://www.cnblogs.com/lvchengda/p/13054457.html 使用 @Slf4j 1)安装插件lombok 在eclipse/myec ...
- python的坑--你知道吗?
python的坑--你知道吗? 1.列表的坑 坑的地方是:因为列表用pop之后,后面的索引都会自动减一 # 列表的坑之一 list1 = ['python','java','php','c','c++ ...
- 基于NACOS和JAVA反射机制动态更新JAVA静态常量非@Value注解
1.前言 项目中都会使用常量类文件, 这些值如果需要变动需要重新提交代码,或者基于@Value注解实现动态刷新, 如果常量太多也是很麻烦; 那么 能不能有更加简便的实现方式呢? 本文讲述的方式是, 一 ...
- jmeter组件中 测试计划,线程组,sampler等等
[测试计划] 这边用户定义的变量,定义整个测试中使用的重复值(全局变量),一般定义服务器的ip,端口号 [线程组] 关于,线程组,我简单聊聊,有不对的地方欢迎大家拨乱反正 线程数:你需要运行的线程 比 ...
- ASP.NET WebAPI框架解析第二篇(HttpModule的创建和使用)
我们先看一下执行流程图 图中画红圈的部分便是HttpModule,在说创建HttpModule之前,先说一下HttpApplication对象,HttpApplication对象由Asp.net框架创 ...
- windows10安装配置WSL(Ubuntu)
windows10安装配置WSL(Ubuntu) 怎么在windows系统上用上Linux?有这么几种方法: 1. 安装双系统.这种方法的缺点是每次切换系统都需要关机.切换系统. 2. 虚拟机+Lin ...