12_QT学习笔记_(数据文件的读取、写入、保存)

01 数据文件的读取
例1.1:

利用lambda函数简单实现数据文件读取,并将内容显示于文本框

第一步:界面设计

利用Qt的ui设计界面,拖拽获取所需控件,如下图所示:
在这里插入图片描述
第二步:代码编写

  • 按钮点击后,创建文件夹窗口QFileDialog,并获取文件路径信息,并在QLineEdit中显示。

  • 利用获取的文件路径,构建文件对象QFile,并打开对应文件。

  • 判读文件是否位于结尾,若不是则逐行读取文件内容,用1024字节的char数组存储行内容。

  • 将获取的内容,在QTextEdit中显示,如果出现中文乱码,需要制定编码格式GBK。

Qt_08_QFile_1/Sources/Mainwindow.cpp

#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>  //打开文件夹窗口
#include <QTextCodec>   //编码格式头文件

//功能:打开目标文件读取内容,并将其写入TextEdit控件中去
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->FileBtn, &QPushButton::clicked, [this](){

        //获取要打开的文件名,并将文件名(包含)填入行文本框(lineEdit)
        QString fileName = QFileDialog::getOpenFileName(this, "选择文件");              //打开任意路径的文件
        //QString fileName = QFileDialog::getOpenFileName(this, "选择文件", "C:/");     //只能打开C盘下的文件
        ui->lineEdit->setText(fileName);

        //将文件的内容,全部读入文本框内(textEdit)
        QFile GKW_file(fileName); //构建文件对象 对文件做相关操作
        if(!GKW_file.open(QIODevice::ReadOnly)) //打开文件用于读 判断是否正常打开
        {
            return;
        }

        while(!GKW_file.atEnd()) //判断文件结尾
        {
            char str[1024] = {0};
            GKW_file.readLine(str, sizeof str); //一行一行读入 参数1:读入的目标地址 参数2:单行读入最大长度
            //ui->textEdit->append(str);

            //指定为GBK,避免中文文本乱码
            QTextCodec* codec = QTextCodec::codecForName("GBK");
            ui->textEdit->append(codec->toUnicode(str)); //内容不断往后追加
        }
        GKW_file.close(); //文件关闭
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

运行结果如下:
1.文件选择:
在这里插入图片描述
2.内容读取与显示:
在这里插入图片描述

例1.2:

改写例1.1,利用信号与槽,实现数据文件读取,并将内容显示于文本框。通过编写自定义槽函数,并将其与按钮点击的信号相连接,触发执行

Qt_08_QFile_2/Sources/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();

public slots:
    void OnFileBtnClicked(); //方法一,自己写槽函数,并写connect函数

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Qt_08_QFile_2/Sources/Mainwindow.cpp

#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> //打开文件夹窗口
#include <QTextCodec> //编码格式头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->FileBtn, &QPushButton::clicked,this, &MainWindow::OnFileBtnClicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::OnFileBtnClicked() //文件读取
{
    QString fileName = QFileDialog::getOpenFileName(this, "选择文件");
    ui->lineEdit->setText(fileName);

    QFile file_01(fileName);
    if(!file_01.open(QIODevice::ReadOnly))
    {
        return;
    }

    while(!file_01.atEnd())
    {
        char str[1024];
        file_01.readLine(str, sizeof(str));
        QTextCodec* codestyle = QTextCodec::codecForName("GBK");
        ui->textEdit->append(codestyle->toUnicode(str));
    }
    file_01.close();
}
例1.3:

改写例1.2,利用ui设计界面的转到槽,绑定并创建槽函数,无需手动编写connect()函数。选中按钮控件,右键->选择“转到槽”
在这里插入图片描述

  • 利用字节数组QByteArray,读取文件内容,按行读取并追加存入QByteArray。
  • 字节数组QByteArray为QString的底层类,相当于数据表,里面存储元素为char类型。
  • QString类型依赖于QByteArray,可以用后者构造前者,QString(QByteArray)。

Qt_08_QFile_2/Sources/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 on_pushButton_clicked(); //方法二,在ui界面选择按钮,转到槽,省略写connect函数

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Qt_08_QFile_2/Sources/Mainwindow.cpp

#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> //打开文件夹窗口
#include <QTextCodec> //编码格式头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked() //文件2读取
{
    QString fileName = QFileDialog::getOpenFileName(this, "选择文件");
    ui->lineEdit->setText(fileName);

    QFile file_01(fileName);
    if(!file_01.open(QIODevice::ReadOnly))
    {
        return;
    }

    QByteArray arr; //字节数组(字符动态数组,每个字节相当于一个char),不需考虑每行长度
    while(!file_01.atEnd())
    {
        arr += file_01.readLine();
    }
    QTextCodec* codestyle = QTextCodec::codecForName("GBK"); //设置编码方式,防止中文乱码
    ui->textEdit->setText(codestyle->toUnicode(arr));

    file_01.close();
}

02 数据文件的写入
例2.1:

将文本框内读取到的内容,另存为一个新的文件

第一步:界面设计

利用Qt的ui设计界面,拖拽获取所需控件,如下图所示:
在这里插入图片描述
第二步:代码编写

  • 利用QFileDialog::getSaveFileName()创建保存的文件路径名称(可设置默认路径,保存文件类型等)。
  • 利用获取的保存文件路径名称作为参数,创建用于保存的文件对象QFile。
  • 打开文件对象,打开模式为写入模式(QIODevice::WriteOnly)。
  • 获取文本框内容之后,利用toUtf8()函数,将QString类型转换为QByteArray类型,再写入。

Qt_08_QFile_2/Sources/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();

public slots:
    void OnFileBtnClicked(); 
    void on_SaveAsBtn_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

Qt_08_QFile_2/Sources/Mainwindow.cpp

#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog> //打开文件夹窗口
#include <QTextCodec> //编码格式头文件

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->FileBtn, &QPushButton::clicked,this, &MainWindow::OnFileBtnClicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::OnFileBtnClicked() //文件读取
{
    QString fileName = QFileDialog::getOpenFileName(this, "选择文件");
    ui->lineEdit->setText(fileName);

    QFile file_01(fileName);
    if(!file_01.open(QIODevice::ReadOnly))
    {
        return;
    }

    while(!file_01.atEnd())
    {
        QTextCodec* codestyle = QTextCodec::codecForName("GBK");

        char str[1024];
        file_01.readLine(str, sizeof(str));
        ui->textEdit->append(codestyle->toUnicode(str));
    }
    file_01.close();
}


//文件写入(另存为)
void MainWindow::on_SaveAsBtn_clicked()
{
//    QFileDialog::getSaveFileName(this, "另存为", "C:/未命名.txt", "*.txt");
    QString filename = QFileDialog::getSaveFileName(this, "另存为", "未命名.docx", "*.docx");

    QFile file(filename);
    if(!file.open(QIODevice::WriteOnly)) //打开文件,用于写
    {
        return;
    }

    QString str01 = ui->textEdit->toPlainText();    //使用QString接一下textEdit内容
    file.write(str01.toUtf8());                     //.toUtf8()可以将QString转化为QByteArray

    file.close();
}

运行结果如下:
1.文件保存:
在这里插入图片描述

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值