• 使用Qt实现文本文件的读写操作


    文本读写简介

    在现代应用程序开发中,文件操作是一个不可或缺的任务。无论是读取配置文件、处理用户输入,还是保存日志信息,文件的读取和写入操作都非常重要。Qt框架作为一个强大且灵活的跨平台C++框架,为文件操作提供了丰富的类和方法。在本文中,我们将探讨如何使用Qt进行文本文件的读取和写入操作,特别是使用QFileDialog类来打开和保存文件。我们将展示如何通过一个简单的图形用户界面(GUI),利用QFile、QTextStream和QFileDialog类来高效地进行文件操作。


    QFileDialog

    简介

    QFileDialog是Qt中用于打开和保存文件的对话框类。它提供了一个标准的文件选择对话框,用户可以通过该对话框浏览文件系统并选择文件。

    常用方法

    • getOpenFileName(): 打开一个文件选择对话框,返回所选文件的路径。
    • getSaveFileName(): 打开一个保存文件对话框,返回用户输入的文件路径。
    • getExistingDirectory(): 打开一个目录选择对话框,返回所选目录的路径。

    示例代码

    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
                                                    tr("Text Files (*.txt);;All Files (*)"));
    
    if (fileName.isEmpty())
        return;
    

    上面的代码展示了如何使用QFileDialog打开一个文件选择对话框,并获取用户选择的文件路径。

    QFile

    简介

    QFile类提供了对文件进行读写操作的接口。它可以处理文本文件和二进制文件,并且支持多种打开模式,如只读、只写、读写等。

    常用方法

    • open(): 打开文件,指定打开模式(只读、只写、读写等)。
    • close(): 关闭文件。
    • readAll(): 读取文件的全部内容。
    • readLine(): 读取文件的一行内容。
    • write(): 向文件写入数据。
    • flush(): 刷新文件缓冲区,将缓冲区中的数据写入文件。

    示例代码

    QFile file("example.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning("Cannot open file for reading");
        return;
    }
    
    // 读取文件内容
    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        qDebug() << line;
    }
    
    file.close();
    

    上面的代码展示了如何使用QFile类打开并读取一个文本文件。

    QTextStream

    简介

    QTextStream类用于在文本流中进行读写操作。它可以与QFile、QBuffer等类结合使用,以便在文件或内存中进行文本读写。

    常用方法

    • operator<<: 向文本流中写入数据。
    • operator>>: 从文本流中读取数据。
    • readAll(): 读取文本流的全部内容。
    • readLine(): 读取文本流的一行内容。
    • setCodec(): 设置文本流的编码方式。

    示例代码

    QFile file("example.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning("Cannot open file for reading");
        return;
    }
    
    QTextStream in(&file);
    while (!in.atEnd()) {
        QString line = in.readLine();
        qDebug() << line;
    }
    
    file.close();
    

    上面的代码展示了如何使用QTextStream类逐行读取文本文件的内容。

    结合使用示例

    以下是一个完整的示例,展示如何使用QFileDialog选择文件,然后使用QFile和QTextStream读取文件内容:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    class FileReader : public QWidget {
    public:
        void readFile() {
            QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
                                                            tr("Text Files (*.txt);;All Files (*)"));
    
            if (fileName.isEmpty())
                return;
    
            QFile file(fileName);
            if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                qWarning("Cannot open file for reading");
                return;
            }
    
            QTextStream in(&file);
            while (!in.atEnd()) {
                QString line = in.readLine();
                qDebug() << line;
            }
    
            file.close();
        }
    };
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
        FileReader reader;
        reader.readFile();
        return app.exec();
    }
    

    这段代码展示了一个完整的Qt应用程序,它使用QFileDialog打开一个文件选择对话框,用户选择文件后,程序会使用QFile和QTextStream读取文件内容并输出到调试控制台。

    完整示例代码(读写操作,可直接复制运行我使用的Qt版本为QT5.14)

    首先,在你的UI文件中(mainwindow.ui),添加两个按钮,一个用于打开文件,另一个用于保存文件。你可以使用Qt Designer来添加这些按钮,并命名为openFileButtonsaveFileButton

    ps:请注意,在UI文件中创建好按钮后,一定要重新构建,重新生成UI文件,否则会报错

    接下来,在MainWindow类中实现文件的读写操作:

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include 
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private slots:
        void openFile();
        void saveFile();
    
    private:
        Ui::MainWindow *ui;
        QString currentFileContent;
    };
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include 
    #include 
    #include 
    #include 
    #include 
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect(ui->openFileButton, &QPushButton::clicked, this, &MainWindow::openFile);
        connect(ui->saveFileButton, &QPushButton::clicked, this, &MainWindow::saveFile);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::openFile() {
        QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
                                                        tr("Text Files (*.txt);;All Files (*)"));
    
        if (fileName.isEmpty()) {
            return;
        }
    
        QFile file(fileName);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            QMessageBox::warning(this, tr("Error"), tr("Cannot open file for reading"));
            return;
        }
    
        QTextStream in(&file);
        currentFileContent = in.readAll();
        file.close();
    
        QMessageBox::information(this, tr("Success"), tr("File content read successfully"));
        qDebug() << currentFileContent;
    }
    
    void MainWindow::saveFile() {
        QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "",
                                                        tr("Text Files (*.txt);;All Files (*)"));
    
        if (fileName.isEmpty()) {
            return;
        }
    
        QFile file(fileName);
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            QMessageBox::warning(this, tr("Error"), tr("Cannot open file for writing"));
            return;
        }
    
        QTextStream out(&file);
        out << currentFileContent;
        file.close();
    
        QMessageBox::information(this, tr("Success"), tr("File saved successfully"));
    }
    

    main.cpp

    #include "mainwindow.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    

    在这里插入图片描述

    代码解释

    1. openFile()函数

      • 使用QFileDialog::getOpenFileName()打开文件选择对话框,获取用户选择的文件路径。
      • 使用QFile打开所选文件,并检查文件是否成功打开。
      • 使用QTextStream读取文件内容并存储在currentFileContent变量中。
      • 显示读取成功的消息框,并在调试控制台输出文件内容。
    2. saveFile()函数

      • 使用QFileDialog::getSaveFileName()打开文件保存对话框,获取用户输入的保存文件路径。
      • 使用QFile打开指定文件,并检查文件是否成功打开。
      • 使用QTextStream将currentFileContent变量中的内容写入文件。
      • 显示保存成功的消息框。
  • 相关阅读:
    python3
    SIMD理解和学习入门资源
    机器视觉常见的问题及解决
    DMPE-PEG-Mal,二肉豆蔻酰磷脂酰乙醇胺-聚乙二醇-马来酰亚胺简述
    【洛谷】P5149 会议座位
    typescript11-数据类型
    Twisted 与 Tornado 中的 WebSocket 连接问题及解决方案
    Hololens开发之实时音视频通讯--01部署开发环境
    vue CORS 跨域问题 的终极解决方案
    Redis 核心面试题归纳
  • 原文地址:https://blog.csdn.net/qq_35803412/article/details/139453898