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

文章目录

  • 文本读写简介
    • QFileDialog
      • 简介
      • 常用方法
      • 示例代码
    • QFile
      • 简介
      • 常用方法
      • 示例代码
    • QTextStream
      • 简介
      • 常用方法
      • 示例代码
    • 结合使用示例
    • 完整示例代码(读写操作,可直接复制运行我使用的Qt版本为QT5.14)
      • mainwindow.h
      • mainwindow.cpp
      • main.cpp
      • 代码解释

文本读写简介

在现代应用程序开发中,文件操作是一个不可或缺的任务。无论是读取配置文件、处理用户输入,还是保存日志信息,文件的读取和写入操作都非常重要。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 <QApplication>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QWidget>

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 <QMainWindow>

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 <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>

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 <QApplication>

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变量中的内容写入文件。
    • 显示保存成功的消息框。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

MySQL之查询性能优化(四)

查询性能优化 MySQL客户端/服务器通信协议 一般来说&#xff0c;不需要去理解MySQL通信协议的内部实现细节&#xff0c;只需要大致理解通信协议是如何工作的。MySQL客户端和服务器之间的通信协议是"半双工"的&#xff0c;这意味着&#xff0c;在任何一个时刻&#…

History 模式和 Hash 模式路由的区别、优缺点及在开发生产环境中的注意事项

在现代单页应用&#xff08;SPA&#xff09;开发中&#xff0c;前端路由是至关重要的一部分。常见的路由模式有两种&#xff1a;History 模式和 Hash 模式。本文将详细探讨这两种模式的区别、优缺点&#xff0c;并在开发和生产环境中的注意事项。 路由模式简介 Hash 模式 H…

.Net 基于.Net8开发的一个Asp.Net Core Webapi后端框架

1.项目结构 该项目是基于.net8开发的Asp.Net Core WebApi后端服务,集成了Efcore,Autofac,Jwt,AutoMapper,Serilog,Quartz,MiniExcel等组件。该框架简单易上手&#xff0c;没有额外的学习成本; 该项目采用了多层结构设计&#xff0c;有利于解耦&#xff0c;包含公共层&#xff0…

机器视觉——硬件常用基础知识

光源 机器视觉中光源的作用 1&#xff09;强化特征&#xff0c;弱化背景 2&#xff09;光源打得好&#xff0c;图好了&#xff0c;后期算法更简化 3&#xff09;图好了&#xff0c;测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光&#xff1a;通常用…

【分享】两种方法禁止修改Word文档

对于比较重要的Word文件&#xff0c;不想被随意编辑修改&#xff0c;可以试试以下两个方法&#xff0c;不清楚的小伙伴&#xff0c;一起来看看吧&#xff01; 方法1&#xff1a;设置“只读方式” 我们可以给Word文档设置以“只读方式”打开&#xff0c;这样就算编辑修改了文档…

企业内部聊天软件Riot部署

ubuntu docker 简介 Riot(原Vector)是使用Matrix React SDK构建的Matrix网络聊天客户端,开源免费,功能丰富,支持私人对话,团队对话,语言视频对话,上传文件,社区互动。支持在聊天界面添加各种有趣的插件,比如RSS等各种机器人、虚拟币实时监控等。并且所有通过Riot传…

63. UE5 RPG 兼容没有武器的普通攻击

前面&#xff0c;我们实现了近战攻击技能&#xff0c;敌人通过AI靠近玩家&#xff0c;并且通过AI还能够触发近战攻击的释放。现在我们思考一个问题&#xff0c;如果敌人没有武器&#xff0c;攻击的手段是用的双手&#xff0c;我们该如何去获取它的攻击范围。 现在实现的一套是获…

什么情况!伯克希尔哈撒韦股票跌近100%

KlipC报道&#xff1a;当地时间6月3日开盘后&#xff0c;纽约证劵交易所的一个技术问题导致沃伦巴菲特(Warren Buffett)旗下伯克希尔哈撒韦公司(Berkshire Hathaway)A类股票似乎下跌了近100%&#xff0c;达到185.1美元/股。目前&#xff0c;所有受影响的股票已经恢复交易。 除了…

OLED_讲解

OLED&#xff08;有机发光二极管 Organic Light-Emitting Diode&#xff09;是一种显示技术&#xff0c;它使用有机化合物材料作为发光层&#xff0c;当通过电流时&#xff0c;这些材料会发光。OLED显示器由多个单独可控制的OLED像素组成&#xff0c;每个像素都能够发出红、绿、…

【异常分析:四分位距与3σ原则】

文章目录 前言四分位距&#xff08;IQR&#xff09;3σ原则使用步骤计算四分位距应用3σ原则 代码 前言 异常分析的目标是识别数据中的异常值&#xff0c;这些异常值可能是由于错误的记录、设备故障或者其他未知原因导致的。四分位距&#xff08;interquartile range, IQR&…

目标检测数据集 - 海洋垃圾检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;海洋垃圾检测数据集&#xff0c;真实拍摄海洋海底场景高质量垃圾检测图片数据&#xff0c;涉及场景丰富&#xff0c;比如海底塑料垃圾数据、海底铁制品罐状垃圾数据、海底纸张垃圾数据、海洋生物和海底垃圾同框数据、海底探索仪器和海底垃圾同框数据、海…

前端localForage存储数据使用教程

前言 前端本地化存储算是一个老生常谈的话题了&#xff0c;我们对于 cookies、Web Storage&#xff08;sessionStorage、localStorage&#xff09;的使用已经非常熟悉&#xff0c;在面试与实际操作之中也会经常遇到相关的问题&#xff0c;但这些本地化存储的方式还存在一些缺陷…

iPhone录音的m4a格式音频文件怎么转成MP3格式?

在日常工作生活中&#xff0c;我们有时会用电脑或手机录音&#xff0c;比如iPhone录音的M4A格式音频&#xff0c;要上传至某些软件或者平台使用&#xff0c;但是有时这些平台或者软件对音频格式有要求&#xff0c;比如有的就只能上传mp3格式的文件。 这个时候我们就需要先将音频…

在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南

效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂&#xff0c;还通过其强大的扩展库支持丰富的后期处理效果&#xff0c;为3D场景增添无限魅力。本篇文章将引导您深入了…

客户案例|Zilliz Cloud 助力点石科技转型 AI 智能服务商

福建点石科技网络科技有限公司成立于2010年&#xff0c;是国家高新技术企业&#xff0c;阿里云、蚂蚁金服等大厂海内外生态合作伙伴ISV。在餐饮、零售、酒店、旅游、商圈的行业定制化服务化上有深厚积累&#xff0c;在境内外做了大量标杆性软件项目&#xff0c;如东南亚RWS圣淘…

详解智慧互联网医院系统源码:开发医院小程序教学

本篇文章&#xff0c;笔者将详细介绍智慧互联网医院系统的源码结构&#xff0c;并提供开发医院小程序的详细教学。 一、智慧互联网医院系统概述 智慧互联网医院系统涵盖了预约挂号、在线咨询、电子病历、药品管理等多个模块。 二、系统源码结构解析 智慧互联网医院系统的源码…

【软件测试】自动化测试如何管理测试数据

前言 在之前的自动化测试框架相关文章中&#xff0c;无论是接口自动化还是UI自动化&#xff0c;都谈及data模块和config模块&#xff0c;也就是测试数据和配置文件。 随着自动化用例的不断增加&#xff0c;需要维护的测试数据也会越来越多&#xff0c;维护成本越来越高&#…

MySQL Hints:控制查询优化器的选择

码到三十五 &#xff1a; 个人主页 MySQL Hints是优化数据库查询性能的一种强大工具。它们允许开发者在SQL查询中嵌入指令&#xff0c;以影响MySQL优化器的决策过程。在某些情况下&#xff0c;优化器可能无法选择最佳的查询执行计划&#xff0c;这时我们可以使用Hints来引导优化…

上位机图像处理和嵌入式模块部署(f407 mcu中的网络开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和大家想的不太一样&#xff0c;只要mcu当中带有了mac ip&#xff0c;那么就意味着mcu本身支持了网络开发。但是如果需要mcu支持完整的tcp/ip&…