知识点
- QFile读写文件
- QFileInfo获取文件信息
- QDataStream读写文件
- QTextStream读写文件
- 内存文件QBuffer读写文件
结果演示
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_ReadButton_clicked();
void on_WriteButton_clicked();
//通过文件流读写文件
void writeDate();
void readDate();
//第三种方式通过QTextStream读写文件
void writeDateTextStre();
void readDateTextStre();
//第四种方式通过内存文件QBuffer读写文件
void WriteReadBuffer();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
#include <QDataStream>
#include <QTextStream>
#include <QBuffer>//内存文件
#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//第二种方式通过QDataStream读写文件
writeDate();
readDate();
//第三种方式通过QTextStream读写文件
writeDateTextStre();
readDateTextStre();
//第四种方式通过内存文件QBuffer读写文件
WriteReadBuffer();
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_ReadButton_clicked()
{
QString path=QFileDialog::getOpenFileName(this, tr("Open File"),
"../",
tr("Text files (*.txt);;Images (*.png *.xpm *.jpg)"));
//路径打开了
if(!path.isEmpty()){
//文件对象
QFile file(path);
bool openOk=file.open(QIODevice::ReadOnly);
if(openOk){
#if 0
//读文件,默认只识别utf8编码
QByteArray array=file.readAll();
//显示到编辑区
ui->textEdit->setText(array);
#endif
QByteArray array;
while(!file.atEnd()){
//读一行
array+=file.readLine();
}
ui->textEdit->setText(array);
}
file.close();
}
//QFileInfo获取文件信息
QFileInfo FileDate(path);
qDebug()<<FileDate.exists();
if(FileDate.exists()){
qDebug() << "文件名字:" <<FileDate.fileName();
qDebug() << "文件大小:" << FileDate.size()<<"bit";
qDebug() << "文件创建时间:" <<FileDate.created().toString("yyyy-MM-dd hh:mm:ss");
}
}
void Widget::on_WriteButton_clicked()
{
QString path=QFileDialog::getSaveFileName(this, tr("Save File"),
"../",
tr("Text files (*.txt);;Images (*.png *.xpm *.jpg)"));
//成功了
if(!path.isEmpty()){
//文件对象
QFile file(path);
//打开文件,只写方式
bool openOk=file.open(QIODevice::WriteOnly);
if(openOk){
//获取编辑区内容
QString str=ui->textEdit->toPlainText();
//显示中文,转为uft8
QByteArray strArray=str.toUtf8();
file.write(str.toUtf8());
}
file.close();
}
}
//通过文件流读写文件
void Widget::writeDate(){
QString path("../dateTxt.txt");
//qDebug()<<path;
//创建文件对象
QFile file(path);
//打开文件,只写方式
bool openOk=file.open(QIODevice::WriteOnly);
if(openOk){
//创建数据流,和file文件关联
//往数据流中写数据,相当于往文件里写数据
QDataStream stream(&file);
stream<<QString("QDataStream 今年年龄:")<<26;
file.close();
}
}
void Widget::readDate(){
QString path("../dateTxt.txt");
//qDebug()<<path;
//创建文件对象
QFile file(path);
//打开文件,只写方式
bool openOk=file.open(QIODevice::ReadOnly);
if(openOk){
//创建数据流,和file文件关联
//往数据流中读数据,相当于往文件里读数据
QDataStream stream(&file);
//读的时候,按写的顺序取数据
QString str;
int a;
stream>>str>>a;
//qDebug() << str.toUtf8().data() << a;
cout << str.toUtf8().data() << a;
file.close();
}
}
//第三种方式通过QTextStream读写文件
void Widget::writeDateTextStre(){
QString path("../DemoTxt.txt");
//qDebug()<<path;
//创建文件对象
QFile file(path);
//打开文件,只写方式
bool openOk=file.open(QIODevice::WriteOnly);
if(openOk){
//创建数据流,和file文件关联
//往数据流中写数据,相当于往文件里写数据
QTextStream stream(&file);
//指定编码
stream.setCodec("UTF-8");
stream<<QString("QTextStream 今年年龄:")<<26;
file.close();
}
}
/*使用readData()函数的话,能够输出结果,只是输出的结果中会多出一个0;
* 这是因为利用这种办法它并不能判断字符串的结尾,所以就将str和a当成一个字符串了,到后面要输出a的时候,
* 里面已经没有内容了,于是就输出了0;
* 这也说明使用这种方式读内容的话,并不安全,
* 所以应该采用readall、readline的方式
*/
void Widget::readDateTextStre(){
QString path("../DemoTxt.txt");
//qDebug()<<path;
//创建文件对象
QFile file(path);
//打开文件,只写方式
bool openOk=file.open(QIODevice::ReadOnly);
if(openOk){
//创建数据流,和file文件关联
//往数据流中写数据,相当于往文件里写数据
QTextStream stream(&file);
//指定编码
stream.setCodec("UTF-8");
// QString str01=stream.readAll();
// cout<<str01;
QByteArray str;
while(!file.atEnd()){
str+=file.readLine();
}
cout<<str;
file.close();
}
}
//第四种方式通过内存文件QBuffer读写文件
void Widget::WriteReadBuffer(){
//QBuffer写文件
QBuffer merbuffer;
merbuffer.open(QIODevice::WriteOnly);
QDataStream stream(&merbuffer);
stream<<QString("QBuffer 今年年龄:")<<26;
merbuffer.close();
//cout<<merbuffer.buffer();
merbuffer.open(QIODevice::ReadOnly);
QDataStream streamOut(&merbuffer);
//读的时候,按写的顺序取数据
QString str;
int a;
streamOut>>str>>a;
//qDebug() << str.toUtf8().data() << a;
cout << str.toUtf8().data() << a;
merbuffer.close();
}