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();

一次只读取一行:

 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文件,可以发现文件是可读的,不会乱码。

最新文章

  1. spider RPC高级特性
  2. 打包SpringBoot工程并部署
  3. MVC 随记
  4. 3Git使用入门
  5. 【idea】移动下载站
  6. bzoj 1226 [SDOI2009]学校食堂Dining(状压DP)
  7. DataGrid( 数据表格) 组件[2]
  8. Linq to BBJECT之非延时标准查询操作符
  9. H264源码分析(二)
  10. 文件下载Demo
  11. bnu 34986 Football on Table(数学+暴力)
  12. mongodb分片认证
  13. [LeetCode] Most Frequent Subtree Sum 出现频率最高的子树和
  14. neuFlow&amp;CNP-卷积计算加速器&amp;神经网络加速芯片生态系统
  15. Eclipse各个版本及其对应代号、下载地址列表
  16. C#的两种类据类型:值类型和引用类型
  17. Ubuntu 16.04下安装golang
  18. C#在dataGridView中遍历,寻找相同的数据并定位
  19. 解题:POI 2008 Plot purchase
  20. A class file was not written. The project may be inconsistent, if so try refreshing this project and building it. eclipse提示错误

热门文章

  1. 使用WPF实现的 喜马拉雅FM 资源下载工具
  2. 跨域问题 - Nginx反向代理
  3. Python流程控制语句详解
  4. 对于Python的GIL锁理解
  5. JSON案例
  6. MFC exe文件生成的图标更改方法
  7. 人脸识别和手势识别应用(face++)开发
  8. [白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall)和F值(F-Measure)
  9. package.json 文件说明:
  10. 浅析Java中Ant的使用