QT基础教程(文件操作深入)

举报
yd_274589494 发表于 2023/09/24 18:29:38 2023/09/24
【摘要】 @TOC 前言本篇文章我们接着讲解QT中的文件操作,上篇文章我们已经讲解完了文件的基本操作,那么本篇文章我们将深入的讲解一下文件中的其他知识。 一、QTextStream和QDataStreamQTextStream 和 QDataStream 是Qt中用于数据流处理的两个重要类,它们用于不同类型的数据处理,有一些关键的区别。QTextStream:QTextStream 主要用于处理文本数...

@TOC


前言

本篇文章我们接着讲解QT中的文件操作,上篇文章我们已经讲解完了文件的基本操作,那么本篇文章我们将深入的讲解一下文件中的其他知识。

一、QTextStream和QDataStream

QTextStream 和 QDataStream 是Qt中用于数据流处理的两个重要类,它们用于不同类型的数据处理,有一些关键的区别。

QTextStream:
QTextStream 主要用于处理文本数据,它提供了文本的读取和写入功能,可以用于读写纯文本文件、字符串等文本数据。

下面是一个示例代码,演示如何使用 QTextStream 读取和写入文本文件:

#include <QFile>
#include <QTextStream>

int main() {
    // 创建一个文本文件
    QFile file("textfile.txt");

    if (file.open(QIODevice::ReadWrite | QIODevice::Text)) {
        // 创建一个 QTextStream 对象,并将文件与之关联
        QTextStream stream(&file);

        // 写入文本数据
        stream << "Hello, QTextStream!" << endl;

        // 从文件中读取文本数据
        QString line = stream.readLine();
        qDebug() << "Read from file: " << line;

        // 关闭文件
        file.close();
    } else {
        qDebug() << "Failed to open file!";
    }

    return 0;
}

QDataStream:
QDataStream 用于二进制数据的读写,它可以用于处理不同类型的二进制数据,如文件、网络数据传输等。与 QTextStream 不同,QDataStream 可以处理更通用的数据类型,而不仅仅是文本。

以下是一个示例代码,演示如何使用 QDataStream 读取和写入二进制文件:

#include <QFile>
#include <QDataStream>

int main() {
    // 创建一个二进制文件
    QFile file("binaryfile.dat");

    if (file.open(QIODevice::ReadWrite)) {
        // 创建一个 QDataStream 对象,并将文件与之关联
        QDataStream stream(&file);

        // 写入整数和字符串
        int intValue = 42;
        QString stringValue = "Hello, QDataStream!";
        stream << intValue << stringValue;

        // 从文件中读取整数和字符串
        int readIntValue;
        QString readStringValue;
        stream >> readIntValue >> readStringValue;

        qDebug() << "Read integer: " << readIntValue;
        qDebug() << "Read string: " << readStringValue;

        // 关闭文件
        file.close();
    } else {
        qDebug() << "Failed to open file!";
    }

    return 0;
}

区别:

1.数据类型:QTextStream 专注于文本数据的读写,而 QDataStream 用于处理二进制数据。

2.数据格式:QTextStream 使用文本格式,适用于可读性较好的文本文件和字符串。QDataStream 使用二进制格式,适用于通用的二进制数据。

3.扩展性:QDataStream 更灵活,可以处理多种数据类型,包括自定义的Qt数据类型,而 QTextStream 主要用于字符串和标准文本数据。

你可以根据需要选择使用哪个类来处理数据,通常在处理文本数据时使用 QTextStream,在处理二进制数据时使用 QDataStream。

二、QBuffer

QBuffer 是 Qt 中的一个用于在内存中管理缓冲区数据的类。它允许你将数据读取到缓冲区中,也可以将缓冲区中的数据写入到其他设备(例如文件、网络套接字)中。下面我将讲解一下 QBuffer 并提供一个使用代码示例。

QBuffer 概述:
QBuffer 类是 QIODevice 的子类,因此它可以像文件一样进行读写操作,但它将数据存储在内存中的缓冲区中而不是磁盘文件中。这对于需要在内存中操作数据而不涉及实际文件的情况非常有用。

使用代码示例:
以下是一个简单的示例代码,演示如何使用 QBuffer 将数据写入缓冲区并从缓冲区中读取数据:

#include <QCoreApplication>
#include <QBuffer>
#include <QDebug>

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

    // 创建一个 QBuffer 对象
    QBuffer buffer;

    // 打开缓冲区以进行写入
    buffer.open(QIODevice::WriteOnly);

    // 创建一个 QTextStream 对象,用于向缓冲区写入数据
    QTextStream out(&buffer);

    // 向缓冲区写入数据
    out << "Hello, QBuffer!" << endl;
    out << "This is a sample text." << endl;

    // 关闭缓冲区
    buffer.close();

    // 打开缓冲区以进行读取
    buffer.open(QIODevice::ReadOnly);

    // 创建一个 QTextStream 对象,用于从缓冲区读取数据
    QTextStream in(&buffer);

    // 从缓冲区中读取数据并打印到控制台
    while (!in.atEnd()) {
        QString line = in.readLine();
        qDebug() << "Read from buffer: " << line;
    }

    // 关闭缓冲区
    buffer.close();

    return a.exec();
}

在这个示例中,我们首先创建了一个 QBuffer 对象,并使用 open 方法以只写模式打开它。然后,我们创建了一个 QTextStream 对象,将数据写入缓冲区。接着,我们关闭了缓冲区,重新打开它以只读模式,然后使用 QTextStream 从缓冲区中读取数据并打印到控制台。

这个示例演示了如何使用 QBuffer 来处理内存中的数据,而不必操作实际的文件。你可以根据需要读写不同类型的数据,而不仅仅是文本数据。

三、QDir

QDir 是 Qt 中用于处理文件和目录的类。它提供了许多方法来执行文件和目录操作,如创建、删除、重命名、遍历目录等。下面我将讲解一下 QDir 并提供一个使用代码示例。

QDir 概述:
QDir 类用于表示和操作文件系统中的目录。它可以用来执行以下操作:

列出目录中的文件和子目录。
创建、删除和重命名目录。
获取目录的路径、名称和属性。
进行文件过滤。
管理目录中的文件和子目录。

使用代码示例:
以下是一个简单的示例代码,演示如何使用 QDir 类来列出目录中的文件和子目录:

#include <QCoreApplication>
#include <QDir>
#include <QDebug>

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

    // 指定要操作的目录路径
    QDir directory("/path/to/your/directory");

    // 列出目录中的所有文件
    QStringList files = directory.entryList(QDir::Files);
    qDebug() << "Files in the directory:";
    for (const QString &file : files) {
        qDebug() << file;
    }

    // 列出目录中的所有子目录
    QStringList subDirectories = directory.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
    qDebug() << "Subdirectories in the directory:";
    for (const QString &subDir : subDirectories) {
        qDebug() << subDir;
    }

    return a.exec();
}

在这个示例中,我们首先创建了一个 QDir 对象,指定了要操作的目录路径。然后,我们使用 entryList 方法来列出目录中的文件和子目录。QDir::Files 表示列出文件,QDir::Dirs 表示列出子目录,QDir::NoDotAndDotDot 用于排除 “.” 和 “…” 这两个特殊目录。

你可以根据需要使用 QDir 来执行其他文件和目录操作,如创建、删除、重命名目录,获取文件属性等。这个类提供了丰富的功能来处理文件系统中的文件和目录。

四、QFileSystemWatcher类

QFileSystemWatcher 是 Qt 中用于监视文件系统中文件和目录变化的类。它允许你注册要监视的文件或目录,然后在这些文件或目录发生变化时接收通知。这对于需要实时响应文件系统中的变化并执行相关操作的应用程序非常有用。下面我将详细讲解 QFileSystemWatcher 类的主要特性和用法。

主要特性:
1.文件和目录监视: QFileSystemWatcher 可以监视文件和目录的变化。你可以通过 addPath() 或 addPaths() 方法向监视器添加要监视的文件或目录路径。

2.事件通知: 当监视的文件或目录发生变化时,QFileSystemWatcher 会发出信号来通知应用程序。你可以通过连接这些信号来实时响应文件系统的变化。

3.跨平台支持: QFileSystemWatcher 在不同平台上都提供了一致的接口,因此你可以轻松地编写跨平台的文件监视代码。

使用示例:
以下是一个简单的示例代码,演示如何使用 QFileSystemWatcher 监视指定目录中文件的变化,并在文件发生变化时接收通知:

#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>

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

    // 创建 QFileSystemWatcher 对象
    QFileSystemWatcher watcher;

    // 添加要监视的文件或目录路径
    QString filePathToWatch = "/path/to/your/file_or_directory";
    watcher.addPath(filePathToWatch);

    // 连接文件变化信号到槽函数
    QObject::connect(&watcher, &QFileSystemWatcher::fileChanged, [](const QString &path) {
        qDebug() << "File" << path << "has changed.";
    });

    // 启动事件循环
    return a.exec();
}

在这个示例中,我们首先创建了一个 QFileSystemWatcher 对象,然后使用 addPath() 方法添加要监视的文件或目录路径。接下来,我们连接了 fileChanged 信号到一个槽函数,该槽函数会在文件变化时被调用。最后,通过调用 a.exec() 来启动事件循环,使应用程序保持运行状态以接收文件变化通知。

当指定的文件或目录发生变化时,fileChanged 信号将触发,槽函数将执行并输出相应的信息。

除了 fileChanged 信号,QFileSystemWatcher 还提供了其他信号,如 directoryChanged(目录变化)、fileRenamed(文件重命名)等,以满足不同的监视需求。

请注意,QFileSystemWatcher 的功能受限于操作系统和文件系统的支持,因此在某些情况下,可能无法监视到所有文件系统事件。

总结

本篇文章就讲解到这里。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。