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);
}
第三步:运行结果
每次音量调节后,都会将音量这一属性值存入配置文件中。下次重新打开软件,音量会自动设置为配置文件中的值。