13_QT学习笔记_(二进制文件读取、写入)

01数据文件保存为二进制

计算机对二进制文件比较敏感,读取写入快速。二进制文件读写,可以操作音乐、视频、图片等非文本图片,二进制文件读写应用比较广泛。

例1.1:

点击按钮,写入数据并将其保存为二进制文件,点击按钮读取二进制文件并显示在文本框。

第一步:界面设计

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

二进制文件保存:

  • 利用QFileDialog::getSaveFileName,获取用于保存的二进制文件的路径。
  • 利用用于保存的二进制文件的路径创建文件对象(QFile),并打开文件对象。
  • 利用创建的文件对象(QFile)的指针,创建数据流对象(QDataStream)。
  • 利用<<运算符,将数据写入数据流对象(QDataStream)。
  • 关闭文件对象(QFile)。

二进制文件读取:

  • 利用QFileDialog::getOpenFileName,获取用于读取的二进制文件的路径。
  • 利用用于读取的二进制文件的路径创建文件对象(QFile),并打开文件对象。
  • 利用创建的文件对象(QFile)的指针,创建数据流对象(QDataStream)。
  • 利用>>运算符,将数据读取到对应变量类型。
  • 文本框进行输出显示。
  • 关闭文件对象(QFile)。

Qt_08_QFile_2/Sources/Mainwindow.cpp

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

struct Student
{
public:
    QString name;
    int id;
    bool gender;

    //重载<< >>运算符(友元)
    friend QDataStream& operator<<(QDataStream& stream, Student& stu);
    friend QDataStream& operator>>(QDataStream& stream, Student& stu);
};

QDataStream& operator<<(QDataStream& stream, Student& stu)
{
    stream<<stu.name<<stu.id<<stu.gender;
    return stream;
}

QDataStream& operator>>(QDataStream& stream, Student& stu)
{
    stream>>stu.name>>stu.id>>stu.gender;
    return stream;
}

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();
}

//保存为二进制文件------------------------------------------------
void MainWindow::on_SaveAsBinBtn_clicked()
{
    //1.获取路径
    QString fileName = QFileDialog::getSaveFileName(this, "保存为二进制文件", "D:/未命名.bin", "*.bin"); //仅用于保存,故可以不添加过滤文件类型

    //获取内容(文本框内容)
    QString text = ui->textEdit->toPlainText(); //

    //2.创建文件对象
    QFile file(fileName);

    if(!file.open(QIODevice::WriteOnly))//判断是否正常打开
    {
        return;
    }

    //3.创建流对象
    QDataStream fout(&file); //传入文件对象指针
    fout << 12345;

    QString str = "奋进中的803所!";
    fout << str;

    Student stu{"鼠鼠", 10086, true};
    fout << stu;

    file.close();
}

//读取二进制文件--------------------------------------------------
void MainWindow::on_OpenBinBtn_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, "选择二进制文件", "D:/", "*.bin *.txt");

    //创建文件对象
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }

    //创建数据流对象
    QDataStream fin(&file);
    int num;
    QString str;
    Student stu;

    fin >> num;
    fin >> str;
    fin >> stu;

    qDebug() << num << str;
    //qDebug() << "输出结果为:";

    QString info = "Name:"+stu.name+"id:"+QString::number(stu.id)+"gender:";
    info += (stu.gender ? "男" : "女");
    ui->textEdit->setText(info);

    file.close();
}

第三步:运行结果

1.点击按钮保存为二进制文件:
在这里插入图片描述
2.点击按钮读取二进制文件:
在这里插入图片描述
3.文本框显示二进制文件内容:
在这里插入图片描述
例1.2:

当前音量滑动条的值,保存为二进制文件,下次打开软件,自动读取无需重新设置。

第一步:界面设计

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

  • 选中滑动条控件,右键转到槽,选择valueChanged(int)作为信号。
  • 在槽函数中获取当前音量值,在label中进行显示。
  • 创建QSettings对象,以键值对的形式,存入音量值。
  • 在构造函数中,添加音量读取功能。
    在这里插入图片描述

Qt_08_QFile_2/Sources/Mainwindow.cpp

#include "Mainwindow.h"
#include "ui_mainwindow.h"
#include <QSettings>


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

    //每次运行,读取配置文件音量
    QSettings setting("config.ini");
    ui->verticalSlider->setValue(setting.value("volume").toInt());
}

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

void MainWindow::on_verticalSlider_valueChanged(int value)
{
    ui->label->setText("当前音量:" + QString::number(value)+"%");

    //创建一个配置文件对象
    QSettings settingsFile("config.ini");

    //保存音量到配置文件
    settingsFile.setValue("volume", value);
}


第三步:运行结果

每次音量调节后,都会将音量这一属性值存入配置文件中。下次重新打开软件,音量会自动设置为配置文件中的值。

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值