c++QT文件操作

1 介绍

QT的文件操作来源于其抽象基类QIODevice,中用于处理输入输出设备。提供了统一的接口来处理不同类型的数据源,如文件、套接字、缓冲区等。QIODevice 主要用于读取和写入数据,无论数据来自何种源头,都可以通过 QIODevice 统一地进行处理。

2 成员函数和用法

2.1 成员函数

  1. 打开和关闭: 通过 open(QIODevice::OpenMode mode) 函数可以打开 QIODevice,并且需要指定打开的模式,如只读、只写、读写等。关闭 QIODevice 可以使用 close() 函数。

  2. 读取和写入数据: 使用 read(char *data, qint64 maxSize) 函数从 QIODevice 中读取数据,将读取的数据存储在 data 缓冲区中,最大读取量为 maxSize。使用 write(const char *data, qint64 maxSize) 函数将数据写入 QIODevice

  3. 位置和移动: 通过 pos() 函数可以获取当前的读写位置,通过 seek(qint64 pos) 函数可以移动到指定的读写位置。

  4. 判断状态: 可以使用 atEnd() 函数判断是否已经读取到 QIODevice 的末尾。还可以使用 error() 函数判断是否出现了读写错误。

  5. 模式和标志: QIODevice 可以以不同的模式打开,如文本模式和二进制模式。可以使用 QIODevice::TextQIODevice::Binary 标志来设置。

  6. 继承和用法: QIODevice 是一个抽象基类,许多与输入输出相关的类都继承自它,如 QFileQTcpSocketQBuffer 等。你可以根据具体的需求选择合适的派生类进行文件、网络通信或内存数据的读写操作。

2.2 用法

cpp 复制代码
#include <QCoreApplication>
#include <QBuffer>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建一个 QBuffer 对象,用于读写内存数据
    QBuffer buffer;
    buffer.open(QIODevice::ReadWrite); // 打开为读写模式

    // 写入数据到缓冲区
    QByteArray data = "Hello, QIODevice!";
    buffer.write(data);

    // 移动读写位置到开头
    buffer.seek(0);

    // 从缓冲区读取数据
    QByteArray readData = buffer.readAll();
    qDebug() << "Read data: " << readData;

    return a.exec();
}

3 QCoreApplication

QCoreApplication是 Qt 框架中用于管理应用程序的基础类,它提供了应用程序事件循环、事件处理和应用程序配置等功能。所有使用 Qt 编写的应用程序都需要至少一个 QCoreApplication 对象作为应用程序的核心。

  1. 应用程序的启动和退出: 、静态函数 int exec() 来、启动应用程序的事件循环,这个函数将一直运行,直到应用程序退出。使用 void quit() 函数来退出事件循环,终止应用程序。

  2. 事件处理: 通过 bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event) 函数可以向指定的对象发送事件。也可以通过 bool QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority) 在事件队列中插入一个事件。

  3. 应用程序信息: 可以使用 QString QCoreApplication::applicationDirPath() 获取应用程序所在的目录路径,使用 QString QCoreApplication::applicationFilePath() 获取应用程序的完整路径,使用 QString QCoreApplication::applicationName() 获取应用程序的名称等。

  4. 命令行参数: 可以通过 QStringList QCoreApplication::arguments() 获取应用程序的命令行参数列表。

  5. 应用程序类型: Qt 提供了不同类型的应用程序类,如 QGuiApplication 用于 GUI 应用程序,QCoreApplication 用于非 GUI 应用程序等。

4 QIODevice派生类介绍

当涉及到文件和目录操作时,Qt 提供了一组方便的类来处理,包括 `QFile`、`QFileInfo`、`QDir`、`QTemporaryFile` 和 `QFileSystemWatcher`。

  1. `QFile` 文件的读写操作:提供了打开、关闭、读取、写入和修改文件等功能。可以使用 `QFile` 来处理二进制和文本文件。

2.`QFileInfo` 提供了关于文件和目录的元信息 。用来获取文件的属性、路径、扩展名、大小等信息,以及判断文件是否存在、是否可读、是否可写等。

  1. `QDir` 用于操作目录 ,提供了遍历目录、创建目录、删除目录、列出目录中的文件等功能。还可以用于文件路径的拼接、判断文件是否存在等。

  2. `QTemporaryFile` 用于创建临时文件,临时文件通常在程序运行结束后自动删除。它继承自 `QFile`,提供了创建、打开临时文件的功能。

  3. `QFileSystemWatcher` 可以监视文件和目录的变化,比如文件的创建、删除、修改等。当所监视的文件或目录发生变化时,`QFileSystemWatcher` 会发出相应的信号。

示例:使用这些类进行文件和目录操作:

cpp 复制代码
```cpp
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QTemporaryFile>
#include <QFileSystemWatcher>
#include <QDebug>

int main(int argc, char *argv[])
{
    Q_UNUSED(argc);
    Q_UNUSED(argv);

    // 使用 QFile 进行文件读写操作
    QFile file("example.txt");
    if (file.open(QIODevice::ReadWrite)) {
        file.write("Hello, QFile!");
        file.close();
    }

    // 使用 QFileInfo 获取文件信息
    QFileInfo fileInfo("example.txt");
    qDebug() << "File size:" << fileInfo.size() << "bytes";
    qDebug() << "File path:" << fileInfo.filePath();
    qDebug() << "Is file readable:" << fileInfo.isReadable();

    // 使用 QDir 进行目录操作
    QDir dir(".");
    QStringList fileList = dir.entryList(QDir::Files);
    qDebug() << "Files in current directory:" << fileList;

    // 使用 QTemporaryFile 创建临时文件
    QTemporaryFile tempFile;
    if (tempFile.open()) {
        tempFile.write("Temporary content");
        tempFile.setAutoRemove(true); // 设置临时文件在关闭时自动删除
    }

    // 使用 QFileSystemWatcher 监视文件变化
    QFileSystemWatcher watcher;
    watcher.addPath("example.txt");
    QObject::connect(&watcher, &QFileSystemWatcher::fileChanged, [](const QString &path) {
        qDebug() << "File changed:" << path;
    });

    return 0;
}
```
相关推荐
yangpipi-3 分钟前
数据结构(C语言版)-2.栈和队列
c语言·开发语言·数据结构
还在学习进步6 分钟前
C语言第九周课——经典算法
c语言·开发语言·算法
阿七想学习8 分钟前
数据结构《链表》
java·开发语言·数据结构·学习·链表
极客代码10 分钟前
【Python TensorFlow】进阶指南(续篇二)
开发语言·人工智能·python·深度学习·tensorflow
计算机学姐24 分钟前
基于Python的高校成绩分析管理系统
开发语言·vue.js·后端·python·mysql·pycharm·django
VertexGeek25 分钟前
Rust学习(三):rust基础Ⅱ
开发语言·学习·rust
一个数据小开发31 分钟前
业务开发问题之ConcurrentHashMap
java·开发语言·高并发·map
風清掦1 小时前
C/C++每日一练:编写一个查找子串的位置函数
c语言·c++·算法
三小尛1 小时前
插入排序(C语言)
c语言·开发语言
南宫理的日知录1 小时前
106、Python并发编程:深入浅出理解线程池的内部实现原理
开发语言·python·学习·编程学习