Archivos de aprendizaje, directorios y entrada / salida del módulo Qt Creator (2)
Este artículo es el tema central de la lectura y escritura de archivos. He utilizado tres formas de leer y escribir archivos. Si hay alguna deficiencia, espero poder recibir sus sugerencias.
Si es un principiante, puede ver:
archivos de aprendizaje del módulo Qt Creator, directorios y entrada / salida (1)
2. Leer y escribir archivos (utilizando el método básico QFile)
Para la conveniencia de la descripción en este capítulo, solo escribiré código, que es un programa pequeño.
La forma aproximada es:
Realice los archivos básicos de apertura y almacenamiento.
La función de ranura se puede transferir a la ranura utilizando la interfaz del diseñador,
//打开文件
void MainWindowoid MainWindow::on_pushButton_clicked()
{
QString filename = QFileDialog::getOpenFileName(this,
"open","../","TXT(*.txt)");
if(filename.isEmpty() == false){
QFile file(filename);
if(file.open(QIODevice::ReadOnly)==true){
//全部读完
//读文件,默认只识别utf8,如果想弄别的用文本流
/* QByteArray array = file.readAll();
//显示到编辑区
//ui->textEdit->setText(QString(array));
ui->textEdit->setText(array); */
//一行一行读
QByteArray array;
while(file.atEnd()==false){
//读一行
array = file.readLine();
}
ui->textEdit->setText(array);
}
file.close();
}
}
//保存文件
void MainWindow::on_pushButton_2_clicked()
{
QString filename = QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
if(filename.isEmpty()==false){
QFile file;//创建文件对象
//关联文件名字
file.setFileName(filename);
//打开文件,只写方式
if(file.open(QIODevice::WriteOnly)==true){
//获取内容
QString str = ui->textEdit->toPlainText();
//写文件
//把QString 转化为 QByteArray
file.write(str.toUtf8());
}
}
}
3. Leer y escribir archivos (usando QDataStream para leer y escribir)
Este método se almacena en binario, generalmente lo llamamos almacenamiento de flujo de datos
#include "widget.h"
#include "ui_widget.h"
#include <QDataStream>
#include <QFile>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
writeData();
readData();
}
Widget::~Widget()
{
delete ui;
}
void Widget::writeData()
{
QFile file("../test.txt");
//打开文件,只写方式打开
if(file.open(QIODevice::WriteOnly)==true){
//创建数据流
//往数据流中输入数据
QDataStream stream(&file);
stream << QString("求点赞求关注")<<521;
file.close();
}
}
void Widget::readData()
{
QFile file("../test.txt");
//打开文件,只写方式打开
if(file.open(QIODevice::ReadOnly)==true){
//创建数据流
//往数据流中读取数据
QDataStream stream(&file);
//读的时候,按写的顺序取数据
QString str;
int a;
stream >> str >> a;
qDebug()<<str.toUtf8().data()<<a;
file.close();
}
}
Resultado de la operación:
u
4. Leer y escribir archivos (usando QTextStream para leer y escribir)
Este método se almacena en forma de flujo de texto.
#include "widget.h"
#include "ui_widget.h"
#include <QTextStream>
#include <QFile>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
writeData();
readData();
}
Widget::~Widget()
{
delete ui;
}
void Widget::writeData()
{
QFile file;
//此处的方式都可以,这里用不同的方式是为了让自己知道可以有好几种方式.
file.setFileName("../demo.txt");
//打开文件,只写方式打开
if(true==file.open(QIODevice::WriteOnly))
{
QTextStream stream(&file);
//指定编码,
stream.setCodec("UTF-8");
stream<<QString("求关注")<<521;
file.close();
}
}
void Widget::readData()
{
QFile file("../demo.txt");
//打开文件,只写方式打开
if(true==file.open(QIODevice::ReadOnly)){
QTextStream stream(&file);
//指定编码,
stream.setCodec("UTF-8");
QString str;
int a;
stream >> str >> a;
qDebug()<<str.toUtf8().data()<<a;
file.close();
}
}
Resultado de la operación: De
esta manera, puede ver que hay un 0 al final de mi salida. Esta salida en sí misma es problemática, pero no es un gran problema cuando se usa el diseño de la interfaz.
QString str = stream.readAll();
ui->textEdit->setText(str);
No habrá ningún problema con esto.
5.buffer (archivo de memoria)
QByteArray array;
QBuffer memFile;
memFile.open(QIODevice::WriteOnly);
//加/n是换行
memFile.write("111\n");
memFile.write("222");
memFile.close();
qDebug()<<memFile.buffer();
qDebug()<<"array="<<array;
QBuffer memFile1;
memFile1.open(QIODevice::WriteOnly);
QDataStream stream(&memFile1);
stream<<QString("测试")<<521;
memFile1.close();
// 该方式读不出来
qDebug()<<QString(memFile1.buffer()).toUtf8().data();
memFile1.open(QIODevice::ReadOnly);
QDataStream stream1;
stream1.setDevice(&memFile1);
QString str;int a;
stream1>>str>>a;
memFile1.close();
qDebug()<<str.toUtf8().data()<<a;
Resultados de la operación:
Entre los cuatro métodos, el que más utilizo como estudiante debe ser el primero. Puedes echar un buen vistazo al segundo y tercer método. Personalmente, me siento muy útil.