Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理

2023-09-21 05:15:00

第9章 Qt 5文件及磁盘处理

9.1 读写文本文件

9.1.1 QFile类读写文本

【例】(简单)(CH901)建立基于控制台工程,使用QFile类读写文本文件。
实现步骤如下。
(1)建立一个工程。选择“文件”→“新建文件或项目…”菜单项,在弹出的对话框中选择“项目”组下的“Application”→“ Qt Console Application”菜单项,单击“Choose…”按钮。
(2)在弹出的对话框中对该工程进行命名并选择保存工程的路径,这里将工程命名为“TextFile”,单击“下一步”按钮,再次单击“下一步”按钮,最后单击“完成”按钮,完成该文件工程的建立。

(3)源文件“main.cpp”的具体实现代码如下:

#include <QCoreApplication>
#include <QFile>
#include <QtDebug>
int main(int argc, char *argv[])
{	
    QCoreApplication a(argc, argv);
    QFile file("textFile1.txt");					//(a)
    if(file.open(QIODevice::ReadOnly))				//(b)
    {
       char buffer[2048];
       qint64 lineLen = file.readLine(buffer,sizeof(buffer));			//(c)
       if(lineLen!=-1)						//(d)
       {
           qDebug()<<buffer;
       }
    }
    return a.exec();
}

(4)选择“构建”→“构建项目" TextFile "”菜单项,首先编辑本例所用的文本文件“textFile1.txt”,保存在项目D:\Qt\CH9\CH901\build-TextFile-Desktop_Qt_5_8_0_MinGW_32bit-Debug目录下,然后运行程序,运行结果如图9.1所示。
在这里插入图片描述

9.1.2 QTextStream类读写文本

【例】(简单)(CH902)建立基于控制台的工程,使用QTextStream类读写文本文件。
(1)源文件“main.cpp”的具体实现代码如下:

#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile data("data.txt");
    if(data.open(QFile::WriteOnly|QFile::Truncate))		//(a)
    {
        QTextStream out(&data);
        out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<< endl;									//(b)
    }
    return a.exec();
}

其中,
(a) if(data.open(QFile::WriteOnly|QFile::Truncate)):参数QFile::Truncate表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。
(b) out<<QObject::tr(“score:”)<<qSetFieldWidth(10)<<left<<90<<endl:用户使用格式化函数和流操作符设置需要的输出格式。其中,qSetFieldWidth()函数是设置字段宽度的格式化函数。除此之外,QTextStream还提供了其他一些格式化函数,见表9.1。
在这里插入图片描述
其中,left操作符是QTextStream定义的类似于中的流操作符。QTextStream还提供了其他一些流操作符,见表9.2。
在这里插入图片描述

(2)运行此程序后,可以看到在项目的D:\Qt\CH9\CH902\build-TextFile2-Desktop_Qt_5_8_0_MinGW_32bit-Debug文件夹下自动建立了一个文本文件“data.txt”,打开后看到的内容如图9.2所示。
在这里插入图片描述

9.2 读写二进制文件

【例】(简单)(CH903)使用QDataStream读写二进制文件。
(1)头文件“mainwindow.h”的具体代码如下:

#include <QMainWindow>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void fileFun();
};

(2)源文件“mainwindow.cpp”的具体代码如下:

#include "mainwindow.h"
#include <QtDebug>
#include <QFile>
#include <QDataStream>
#include <QDate>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    fileFun();
}

函数fileFun()完成主要功能,其具体代码如下:

void MainWindow::fileFun()
{
    /*将二进制数据写到数据流 */		//(a)
    QFile file("binary.dat");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate);
    QDataStream out(&file);                         	//将数据序列化
    out << QString(tr("周何骏:"));                   	//字符串序列化
    out << QDate::fromString("1996/09/25", "yyyy/MM/dd");
    out << (qint32)21;                                 	//整数序列化
    file.close();
    /*从文件中读取数据 */			//(b)
    file.setFileName("binary.dat");
    if(!file.open(QIODevice::ReadOnly))
    {
         qDebug()<< "error!";
         return;
    }
    QDataStream in(&file);                        		//从文件中读出数据
    QString name;
    QDate birthday;
    qint32 age;
    in >> name >> birthday >> age;               	//获取字符串和整数
    qDebug() << name << birthday << age;  
    file.close();
}

(3)运行结果如图9.3所示。
在这里插入图片描述

9.3 目录操作与文件系统

9.3.1 文件大小及路径获取实例

【例】(难度一般)(CH904)得到一个文件的大小和所在的目录路径。
源文件“main.cpp”的具体代码。
运行结果如图9.4所示。
在这里插入图片描述
本例项目编译后生成的文件所在的目录是:
D:/Qt/CH9/CH904/build-dirProcess-Desktop_Qt_5_8_0_MinGW_32bit-Debug
该目录下debug文件夹大小为801KB,release文件夹大小为0B(空),编译生成的整个目录的总大小为865KB。

9.3.2 文件系统浏览

【例】(难度一般)(CH905)文件系统的浏览。
创建工程FileView.pro,具体内容如下。
(1)在头文件“fileview.h”中,类FileView继承自QDialog类,具体代码。
(2)源文件“fileview.cpp”的具体代码。
槽函数slotShow()实现了显示目录dir下的所有文件,具体内容如下:

void FileView::slotShow(QDir dir)
{
    QStringList string;
    string<<"*";
    QFileInfoList list=dir.entryInfoList(string,QDir::AllEntries,QDir:: DirsFirst);								//(a)
    showFileInfoList(list);
}

其中,
(a) QFileInfoList list=dir.entryInfoList(string,QDir::AllEntries,QDir:: DirsFirst):QDir的entryInfoList()方法是按照某种过滤方式获得目录下的文件列表。其函数原型如下:

QFileInfoList  QDir::entryInfoList
(
     const QStringList &nameFilters,		
           //此参数指定了文件名的过滤方式,如“*”,“.tar.gz”
     Filters filters=NoFilter,    		
           //此参数指定了文件属性的过滤方式,如目录、文件、读写属性等
     SortFlags sort=NoSort       			
           //此参数指定了列表的排序情况
)const

其中,QDir::Filter定义了一系列的过滤方式,见表9.3。
在这里插入图片描述

QDir::SortFlag定义了一系列排序方式,见表9.4。
在这里插入图片描述
函数showFileInfoList()实现了用户可以双击浏览器中显示的目录进入下一级目录,或单击“…”返回上一级目录,顶部的编辑框显示当前所在的目录路径,列表中显示该目录下的所有文件。其具体代码。
槽函数slotDirShow()根据用户的选择显示下一级目录的所有文件。其具体实现代码内容如下:

void FileView::slotDirShow(QListWidgetItem * item)
{
    QString str=item->text();			//将下一级的目录名保存在str中
    QDir dir;					//定义一个QDir对象
    dir.setPath(fileLineEdit->text());  //设置QDir对象的路径为当前目录路径
    dir.cd(str)			//根据下一级目录名重新设置QDir对象的路径
    fileLineEdit->setText(dir.absolutePath());	//(a)
    slotShow(dir);			//显示当前目录下的所有文件
}

(3)运行结果如图9.5所示。
在这里插入图片描述

9.4 获取文件信息

【例】(简单)(CH906)利用QFileinfo类获得文件信息,如图9.6所示。
在这里插入图片描述
工程FileInfo.pro的具体内容如下。
(1)在头文件“fileinfo.h”中,类FileInfo继承自QDialog类,此类中声明了用到的各种相关控件和函数,其具体内容。
(2)源文件“fileinfo.cpp”的具体内容。
槽函数slotFile()完成通过标准文件对话框获得所需要文件的文件名功能,其具体内容如下:

void FileInfo::slotFile()
{
    QString fileName = QFileDialog::getOpenFileName(this,"打开","/", "files (*)");
    fileNameLineEdit->setText(fileName);
}

槽函数slotGet()通过QFileInfo获得具体的文件信息,其具体内容。
(3)运行结果如图9.6所示。

9.5 监视文件和目录变化

【例】(简单)(CH907)监视指定目录功能,介绍如何使用QFileSystemWatcher。
工程fileWatcher.pro的具体内容如下:
(1)在头文件“watcher.h”中,类Watcher继承自QWidget类,其具体内容如下:

#include <QWidget>
#include <QLabel>
#include <QFileSystemWatcher>
class Watcher : public QWidget
{
    Q_OBJECT
public:
    Watcher(QWidget *parent = 0);
    ~Watcher();
public slots:
    void directoryChanged(QString path);
private:
    QLabel *pathLabel;
    QFileSystemWatcher fsWatcher;
};

(2)源文件“watcher.cpp”的具体内容。
响应函数directoryChanged()使用消息对话框提示用户目录发生了改变,具体实现代码如下:

void Watcher::directoryChanged(QString path)
{
    QMessageBox::information(NULL,tr("目录发生变化"),path);
}

(3)运行结果如图9.7所示。
在这里插入图片描述



本章相关例程源码下载

1.Qt5开发及实例_CH901.rar 下载

Qt5开发及实例_CH901.rar

2.Qt5开发及实例_CH902.rar 下载

Qt5开发及实例_CH902.rar

3.Qt5开发及实例_CH903.rar 下载

Qt5开发及实例_CH903.rar

4.Qt5开发及实例_CH904.rar 下载

Qt5开发及实例_CH904.rar

5.Qt5开发及实例_CH905.rar 下载

Qt5开发及实例_CH905.rar

6.Qt5开发及实例_CH906.rar 下载

Qt5开发及实例_CH906.rar

7.Qt5开发及实例_CH907.rar 下载

Qt5开发及实例_CH907.rar

更多推荐

CTF 全讲解:[SWPUCTF 2022 新生赛]webdog1__start

文章目录参考环境题目learning.php信息收集isset()GET请求查询字符串全局变量$_GETMD5绕过MD5韧性脆弱性md5()弱比较隐式类型转换字符串连接数学运算布尔判断相等运算符MD5绕过科学计数法前缀0E与0e绕过start.php信息收集头部检索f14g.php信息收集探秘F1l1l1l1l1lag

【NLP入门教程】二十三、循环神经网络(RNN)| 小白专场

本教程旨在为初学者提供一份全面而系统的NLP入门指南,探索NLP的核心概念、方法和技术。无论你是计算机科学的新手,还是对自然语言处理领域感兴趣的研究人员,本教程都将为你提供所需的基础知识和实用技能。专栏地址:📕【NLP入门教程】当谈到自然语言处理(NLP)时,深度学习已经成为一种强大而广泛应用的技术。深度学习是一种机

Redis从入门到精通(二:数据类型)

数据存储类型介绍Redis数据类型(5种常用)stringhashlistsetsorted_set/zset(应用性较低)redis数据存储格式redis自身是一个Map,其中所有的数据都是采用key:value的形式存储数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串string

汇编基础(2) -- ARM64

简介ARM架构中,ARM64(也称为AArch64)是一种64位处理器架构,它是ARMv8指令集的一部分。与之前的32位ARM架构相比,ARM64提供了更大的寄存器容量、更广阔的地址空间和更高的计算能力。64位版本的指令集和32位版本的指令集有一些区别,这些区别主要涉及到以下几个方面:寄存器:ARM64架构提供了31个

[ 云计算 | AWS ] IAM 详解以及如何在 AWS 中直接创建 IAM 账号

本章节主要介绍IAM相关知识点以及在AWS控制台窗口如何创建一台AmazonIAM账号。文章目录一、什么是IAM?二、IAM常见种类2.1EIAM2.2CIAM2.3云厂商IAM三、账号(Account)三户模型四、认证(Authentication)4.1认证场景4.2认证方式4.3认证协议4.4认证源五、授权(Au

自然语言处理之北大词性标注集

最近在做人工智能相关技术的学习,在自然语言处理这里发现了词标注标准,顺带分享给小伙伴们词性是词汇基本的语法属性,通常也称为词类。词性标准是在给定句子中判定每个词的语法范畴,确定其词性并加以标注的过程。例如名词、动词、形容词等。中文领域尚无统一的标注标准,较为主流的为北大的词性标注集和宾州词性标注集两大类。下面分享北大的

Python爬虫(二十一)_Selenium与PhantomJS

本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南SeleniumSelenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可

MongoDB【部署 02】mongodb使用配置文件启动、添加为系统服务及自启动(一个报错:[13436][NotMasterOrSecondary])

MongoDB使用配置文件启动、添加为系统服务及设置自启动1.是什么2.下载安装启动配置2.1下载2.2安装2.3配置2.4使用配置文件启动3.设置系统服务及自启动3.1设置为系统服务3.2自启动1.是什么【以下内容来自ChatGPT3.5】MongoDB是一个流行的开源文档型数据库管理系统,广泛用于构建高度可扩展、灵

JVM 程序计数器

Java虚拟机(JVM,JavaVirtualMachine)是一个能够执行Java字节码的虚拟机。在JVM的架构中,程序计数器(ProgramCounter,PC)是一个关键的组成部分。程序计数器用于存储当前正在执行的Java字节码指令的地址。每个线程在JVM中都有自己的程序计数器。每条线程都需要有一个独立的程序计数

计算机视觉与深度学习-图像分割-视觉识别任务02-目标检测-【北邮鲁鹏】

目录标题参考目标检测定义深度学习对目标检测的作用单目标检测多任务框架多任务损失预训练模型姿态估计多目标检测问题滑动窗口(SlidingWindow)滑动窗口缺点AdaBoost(AdaptiveBoosting)参考区域建议selectivesearch思想慢速R-CNN慢速R-CNN思路边界框回归(Bboxreg)慢

leetcode分类刷题:队列(Queue)(二、优先队列解决TopK简单问题)

1、优先队列好像一般都叫堆,以大顶堆为例,顶部第一个元素最大,底部最后一个元素最小,自顶向底是递减的(更准确的说是非递增的),对外只能访问顶部第一个元素(对应索引为0)和底部最后一个元素(对应索引为-1);在Python中,heapq默认维护小顶堆,构造大顶堆时需要在入堆时添加相反数2、本次博客总结下用优先队列解决To

热文推荐