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;
}
```
相关推荐
别致的影分身16 分钟前
Linux 线程池
java·开发语言·jvm
山山而川粤2 小时前
母婴用品系统|Java|SSM|JSP|
java·开发语言·后端·学习·mysql
_君莫笑3 小时前
【视频】将yuv420p的一帧数据写入文件
c++·音视频·yuv420p
迷失蒲公英3 小时前
XML与Go结构互转实现(序列化及反序列化)
xml·开发语言·golang
测试盐4 小时前
c++编译过程初识
开发语言·c++
赖赖赖先生4 小时前
fastadmin 框架 生成qr code 二维码图片,PHP 7.4版本
开发语言·php
玉红7775 小时前
R语言的数据类型
开发语言·后端·golang
夜斗(dou)5 小时前
node.js文件压缩包解析,反馈解析进度,解析后的文件字节正常
开发语言·javascript·node.js
觅远5 小时前
python+PyMuPDF库:(一)创建pdf文件及内容读取和写入
开发语言·python·pdf
神雕杨5 小时前
node js 过滤空白行
开发语言·前端·javascript