一、QFile
头文件:
#include<QFile>
#include<QFileDialog>
QFile 读文件
基本操作
通过按钮打开文件对话框
void Widget::on_pushButton_clicked()
{
QString path =QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");
if(path.isEmpty()==false)
{
//文件对象
QFile file(path);
//打开文件,只读方式打开
bool isOk=file.open(QIODevice::ReadOnly);
if(isOk==true)
{
//读文件 默认只utf8编码
QByteArray arr=file.readAll();
//显示到编辑区
//ui->textEdit->setText(QString(arr));
ui->textEdit->setText(arr);
}
//关闭文件
file.close();
}
}
这里为什么要用QByteArray 类呢因为是readall函数返回值决定
翻译:从设备中读取所有剩余数据,并将其作为字节数组返回。
该函数没有报告错误的方法;返回一个空的QByteArray可能意味着当前没有可供读取的数据,或者发生了错误。
QByteArray简介:
QByteArray类提供了一个字节数组。
QByteArray可以用来存储原始字节(包括’\0’)和传统的8位’\0’结尾的字符串。使用QByteArray要比使用const char *方便得多。在后台,它总是确保数据后面有一个’\0’结束符,并使用隐式共享(写时复制)来减少内存使用,避免不必要的数据复制。
注意
这里的
//读文件 默认UFT-8编码
QByteArray arr=file.readAll();
打开txt文件时会出现乱码
另存为UTF-8后
再打开就可以了
另外
还有一种一行一行的读文件方式
while(file.atEnd()==false)
{
//读行
arr +=file.readLine();
}
ui->textEdit->setText(arr);
也是默认读UTF8格式的
QFile写文件
void Widget::on_pushButton_2_clicked()
{
QString path=QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
if(path.isEmpty()==false)
{
QFile file;//创建文件对象
file.setFileName(path);
//打开文件,只写方式
bool isOk=file.open(QIODevice::WriteOnly);
//判断是否打开
if(isOk==true)
{
//获取编辑区内容
QString str=ui->textEdit->toPlainText();
//写文件
//把QString->QByteArray
file.write(str.toUtf8());//特别是适用于有中文的情况
}
file.close();
}
}
根据write()函数
其他转换方式;
//转换为本地平台编码
file.write(str.toLocal8Bit());
//QString->c++ string->char*
file.write(str.toStdString().data());
//QString->QByteArray->char*
file.write(str.toUtf8().data());
保存到当前项目Debug文件上一级命名“测试.txt”
二、QDataStream数据流文件
头文件
#include<QDataStream>
QDataStream写
void Widget::writeData()
{
QFile file("../test.txt");
//打开文件
bool isOk=file.open(QIODevice::WriteOnly);
if(isOk==true)
{
QDataStream stream(&file);
//创建文件流,和file文件关联
//往数据流输入数据,相当于往文件里写数据
stream<<QString("咸鱼四号突突突")<<250;
}
file.close();
}
在构造函数调用读写后
打开test.txt文件后,你会发现文件乱码,可以通过toLocal8Bit()转成本地编码
(但是再读的时候就要根据编码转换比较麻烦)
这里暂且不管格式是什么。只要能通过读函数读出来就行
QDataStream读
void Widget::readData()
{
QFile file("../test.txt");
//打开文件
bool isOk=file.open(QIODevice::ReadOnly);
if(isOk==true)
{
//往数据流读数据,相当于往文件里读数据
QDataStream stream(&file);
//读的时候,按写的顺序
QString str;
int a;
stream>>str>>a;
qDebug()<<str.toUtf8().data()<<a;//转中文
}
file.close();
}
三、QTextStream
头文件
#include<QTextStream>
QTextStream写
----------------------------.h----------------------------------
public:
Widget(QWidget *parent = nullptr);
~Widget();
void writeData();
void readData();
----------------------------.cpp--------------------------------
void Widget::writeData()
{
QFile file;
file.setFileName("../demo.txt");
bool isOk=file.open(QIODevice::WriteOnly);
if(true==isOk)
{
QTextStream stream(&file);
//默认本地编码,也可以指定编码
stream.setCodec("GB18030");
stream <<QString("突突突!")<<250;
file.close();
}
}
QTextStream读
读文件时不要像QDataStream一样,因为QTextStream对读取的文件没有辨别类型的功能输出的只是字符串,做不到字符数字分离所以要使用下列方式:
QString path=QFileDialog::getOpenFileName(this,"open","../");
if(path.isEmpty()==false)
{
QFile file;
file.setFileName(path);
bool isOk=file.open(QIODevice::ReadOnly);
if(true==isOk)
{
QTextStream stream(&file);
//指定编码
stream.setCodec("UFT-8");
QString str=stream.readAll();
ui->textEdit->setText(str);
file.close();
}
}
四、QFileInfo读取文件信息
头文件
#include<QFileInfo>
由于created返回值是QDataTime
所以还要包含头文件#include<QDateTime>
需要输出#include<QDebug>
用法
几个简单的函数,更多翻阅帮助文档
//获取文件信息
QFileInfo info(path);
qDebug()<<"文件名称"<<info.fileName();
qDebug()<<"文件后缀"<<info.suffix();
qDebug()<<"文件大小"<<info.size();
qDebug()<<"文件创建时间"<<info.created().toString("yyyy-MM-dd hh:mm:ss");