使用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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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变量中的内容写入文件。
    • 显示保存成功的消息框。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端经典面试手写题

前端面试中常会遇到的手写题主要考察应聘者对前端基础知识的掌握程度以及编程能力。以下是一些经典的前端手写题及其解答思路&#xff1a; 手写深拷贝&#xff08;Deep Clone&#xff09; 深拷贝是指复制一个对象及其所有子对象&#xff0c;使得新的对象和原对象完全独立。 …

Python爬虫实战:解析京东商品信息(附部分源码)

在信息爆炸的今天&#xff0c;网络爬虫&#xff08;Web Scraping&#xff09;作为一种自动获取网页内容的技术&#xff0c;已经成为数据采集的重要手段。Python&#xff0c;因其简洁的语法和强大的库支持&#xff0c;成为编写爬虫的首选语言之一。本文将通过一个实战案例&#…

聊聊DoIP吧(二)-报文结构和时间参数

书接上回&#xff0c;DoIP报文及其在以太网帧中的位置&#xff1a;图片来自Vector官网 这里我们来看看DoIP报文结构&#xff1a; DoIP协议时间参数详解 - 知乎 (zhihu.com)

实验三-8086指令的应用《计算机组成原理》

一、实验目的 掌握8086指令的应用 二、实验原理 三、实验仪器 计算机1台&#xff0c;emu8086软件。 四、实验步骤 1、建立00H&#xff5e;0FH&#xff5e;00H 31个数&#xff0c;00H&#xff5e;0FH数据逐渐增大,0FH&#xff5e;00H逐渐减小&#xff0c;即DI指针所表示的地…

linux进程间通讯指南-打通IPC大门,高效沟通无阻

在现代操作系统中&#xff0c;进程就像独立的个体&#xff0c;有时需要相互合作、数据共享&#xff0c;这就要求进程间能够高效通信。本文将为你揭开Linux进程间通信(IPC)的神秘面纱&#xff0c;探讨各种IPC工具的运作原理&#xff0c;同步机制的重要性&#xff0c;以及如何规避…

手动安装Nvidia驱动和CUDA Toolkit

1、打开cuda-toolkit 网站 CUDA Toolkit Archive | NVIDIA Developer 根据自己需要选择CUDA Toolkit版本&#xff0c;这里选择12.0.0 2、点击链接跳转到下载页面&#xff0c;选择操作系统类型和安装包类型 3、下载CUDA Toolkit 安装包 4、执行下载命令 wget https://develo…

【C语言】学生管理系统:完整模拟与实现

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 &#x1f525;引言 本篇文章为修改了在校期间实训报告&#xff0c;使用C…

undefined与null的区别

null表示"没有对象"&#xff0c;即该处不应该有值。 &#xff08;1&#xff09; 作为函数的参数&#xff0c;表示该函数的参数不是对象。 &#xff08;2&#xff09; 作为对象原型链的终点。 Object.getPrototypeOf(Object.prototype) // nullundefined表示"…

Qt+qss动态属性改变控件状态切换的样式

先说点基础的吧&#xff0c;qt的样式实现&#xff0c;常见的主要有三种方式&#xff0c;分别为&#xff1a; 1.ui界面中右键样式表直接添加 2.代码中对控件设置样式setStyleSheet 3.外部预设好qss文件&#xff0c;代码中加载后设置样式 实际工作开发中&#xff0c;我推荐使用优…

停止一个正在运行的线程

暴力停止方法 stop 该方法是不安全的&#xff0c;已经过时的方法&#xff0c;在其方法描述上 This method is inherently unsafe&#xff0c;这个方法实际上是不安全的 package com.alibaba.fescar.core.protocol.test;public class TestThreadStop {public static void main(S…

基于STM32开发的智能水族箱管理系统

目录 引言环境准备智能水族箱管理系统基础代码实现&#xff1a;实现智能水族箱管理系统 4.1 温度传感器数据读取4.2 水泵与加热器控制4.3 水位传感器数据读取4.4 用户界面与显示应用场景&#xff1a;水族箱管理与优化问题解决方案与优化收尾与总结 1. 引言 智能水族箱管理系…

day51 动态规划 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 动态规划 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金 &#xff0c;这里可能有同学疑惑&#xff0c;本题中只能买卖一次&#xff0c;持有股票之后哪还有现金呢&#xff1f; 其实一开始现…

web学习笔记(六十五)

目录 1. Hash模式和History模式 2. 导航守卫 3. 路由元信息 1. Hash模式和History模式 Hash模式&#xff08;历史模式&#xff09;和History模式&#xff08;哈希模式&#xff09;是匹配路由的两种模式&#xff0c;一般默认配置Hash模式&#xff0c;可以在index.js页面中将路…

几种在ARM MCU上控制流水灯的方法

对于初学者&#xff0c;在ARM单片机上控制流水灯的亮灭是必经之路。控制流水灯的亮灭有很多方法&#xff0c;比如8个LED&#xff0c;可以控制8灯同时亮、灭&#xff1b;可以控制8灯依次亮、灭&#xff1b;可以控制8灯依次亮、灭&#xff0c;然后反方向再依次亮、灭&#xff1b;…

python-NLP常用数据集0.1.012

XNLI数据集 用户语言翻译和跨语言分类的语料库 官网地址&#xff1a;https://github.com/facebookresearch/XNLI下载地址&#xff1a;https://dl.fbaipublicfiles.com/XNLI/XNLI-1.0.zip注意事项&#xff1a;数据集有json格式的&#xff0c;和txt格式的数据格式 txt格式 la…

我们正迈向万物互联

物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;是近年来信息技术领域最引人注目的创新之一。它通过将物理世界与数字世界紧密相连&#xff0c;为我们的日常生活、工业生产、城市管理等多个领域带来了前所未有的变革。本文将深入探讨物联网的基本概念、技术原…

Java 18 新功能概述

Java 18 在 2022 年 3 月 22 日正式发布&#xff0c;Java 18 不是一个长期支持版本。 包含多项新特性和改进&#xff0c;如文件系统链接、文本块、表达式求值API、ForkJoinPool优化、Optional新方法等。 亮点还包括预览特性&#xff1a;Record Pattern Matching for Switch和增…

FMEA与8D间之动态化及关联性——SunFMEA软件

企业做好全面质量管理&#xff0c;需要具备&#xff1a;以事先预防、系统化、动态化、创新性四大理念为核心。 为实现质量管理目标&#xff0c;通常采用不同工具和方法&#xff0c;我们会发现&#xff0c;每种工具都有其特定的对象&#xff0c;很多问题的解决都需要多种工具的…

Android - RadioGroup中多个radiobutton同时被选中问题

问题描述: 动态创建radio button, 并将多个button添加到radio group中。但是实际运行时多个radiobutton会被同时选中: 代码如下: mRadioGroup findViewById(R.id.radioGroup);mDevButtons new RadioButton[device_count];for(int i0;i<device_count;i) {mDevButtons[i] …

C++ - 查找算法 和 其他 算法

目录 一. 查找算法&#xff1a; 1.顺序查找&#xff1a; 2.二分查找&#xff1a; 二. 其他算法&#xff1a; 1.遍历算法&#xff1a; 2.求和、求平均值等聚合算法。 a.求和算法&#xff1a; b.求平均值算法&#xff1a; 一. 查找算法&#xff1a; 1.顺序查找&#xff1…