一、基本文件操作
1、文件的读取
Qfile提供了从文件中读取和写入数据的能力。一般是将文件路径作为参数传递给Qfile的构造函数,也可以在创建好对象后,使用setFileName()进行修改。Qfile提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。可以使用QdataStream或者QtextStream类来读写文件,也可以使用QIODevice类土工的read()、readLine()、readAll()以及write()这样的函数进行读写操作。
有关文件的信息是通过QfileInfo进行读取,比如文件名、文件所在目录等,而不是分析文件路径字符串。
在ui界面设计读取文件按钮,按键的槽函数功能是弹出文件对话框界面,传入的参数为父组件、窗口主题、文件地址、打开文件类型。使用的函数为QFileDialog::getOpenFileName(),其返回值的类型为Qstring类型,为文件地址。
接下来在判断文件地址是否为空,不是空的话就创建一个Qfile结构体,在这个类型中传入上一个函数得到的文件地址参数(QFile file(path);)。然后将文件对象打开,使用的函数为:bool isOk = file.open(QIODevice::ReadOnly);,可以在open函数中设置文件打开的属性,然后在文本框中进行显示,显示之后关闭file停止线程占用,使用的函数为:file.close();。
为了获取文件的信息,使用Qfileinfo函数,新建一个QfileInfo类,然后显示文件属性:
读取代码为:
void Widget::on_buttonRead_clicked()
{
//获取文件路径
/*this, 父组件
* "open", 界面主提
* "../", 文件目录,此处表示任意
* "TXT(*.txt)" 打开文件的类型
*/
QString path=QFileDialog::getOpenFileName(this,
"open","../","TXT(*.txt)");
if(path.isEmpty()==false)
{
//文件对象
QFile file(path);
//打开文件,readonly
bool isOk = file.open(QIODevice::ReadOnly);
if(isOk==true)
{
#if 0
//读文件,默认只识别utf8编码
QByteArray array=file.readAll();
//显示到编辑区
ui->textEdit->setText(QString(array));
#endif
//一行一行读取
QByteArray array;
while(file.atEnd()==false)
{
array += file.readLine();
}
ui->textEdit->setText(array);
}
//关闭文件
file.close();
//获取文件信息
QFileInfo info(path);
qDebug()<<"file name: "<<info.fileName().toUtf8().data();//中文显示
qDebug()<<"file houzhui: "<<info.suffix();
qDebug()<<"file size(): "<<info.size(); //以字节为单位
qDebug()<<"file time(): "<<info.created().toString("yyyy-MM-dd hh:mm:ss"); //2020-01-27-22:02
}
}
2、文件的写入
文件的写入与文件读取类似,都是先通过对话框函数获取文件存储的路径,获取到文件存储路径后,将路径传入到文件对象中,也可以使用setfilename()函数实现路径参数传入,比如:
QFile file; //创建文件对象
file.setFileName(path); //关联文件名
然后文件对象以只写方式打开,打开成功的话获取编辑区内容并将其转换为纯文本格式,转换完毕后将纯文本内容传递给Qstring类型变量,最后文件对象使用写入函数将数据转换为标准字符串格式或者UTF8类型写入到指定路径的文件夹中,最后将文件对象关闭。
void Widget::on_buttonWrite_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->QbuteArray
// file.write( str.toUtf8());
file.write(str.toStdString().data()); //纯C++
}
file.close();
}
}
二、二进制文件读写
数据流操作使用二进制文件的形式,头文件为QDataStream,用于处理视频、音频等,例如文件的写入:
void Widget::writeData()
{
//创建文件对象
QFile file("../test.txt");
//打开文件,只写方式打开
bool isOk=file.open(QIODevice::WriteOnly);
if(true==isOk)
{
//关联数据流,和file文件关联
//往数据流中输入数据,相当于往文件 里写数据
QDataStream stream(&file);
stream<<QString("buyao")<<250; //乱码 二进制操作
file.close();
}
}
最终在主函数中调用,会在设定的文件夹中建立一个test.txt文件夹,文件夹内容为二进制格式的写入数据。
二进制文件的读取:
void Widget::readData()
{
//创建文件对象
QFile file("../test.txt");
//打开文件,只读方式打开
bool isOk=file.open(QIODevice::ReadOnly);
if(true==isOk)
{
//定义一个数据流
//关联数据流,和file文件关联
//往数据流中输入数据,相当从往文件里读数据
QDataStream stream(&file);
//读的时候按写的顺序取
QString str;
int a ;
stream>>str>>a;
// qDebug()<<str.toUtf8().data()<<a;
cout<<str.toUtf8().data()<<a; //.toUtf8().data()作用是显示中文
file.close();
}
}
三、文本文件读写
与二进制流文件数据读取类似:
void Widget::writeData()
{
//创建文件对象
QFile file;
file.setFileName("../demo.txt");
//打开文件,只写方式打开
bool isOk=file.open(QIODevice::WriteOnly);
if(true==isOk)
{
//关联数据流,和file文件关联
//往数据流中输入数据,相当于往文件里写数据
QTextStream stream(&file);
//指定编码
stream.setCodec("UTF-8");
stream<<QString("buyao")<<250; //文本
file.close();
}
}
void Widget::readData()
{
//创建文件对象
QFile file("../demo.txt");
//打开文件,只读方式打开
bool isOk=file.open(QIODevice::ReadOnly);
if(true==isOk)
{
//关联数据流,和file文件关联
//往数据流中输入数据,相当从往文件里读数据
QTextStream stream(&file);
//指定编码
stream.setCodec("UTF-8");
//读的时候按写的顺序取
QString str;
int a ;
stream>>str>>a;
// qDebug()<<str.toUtf8().data()<<a;
cout<<str.toUtf8().data()<<a;
file.close();
}
}
void Widget::on_pushButton_clicked()
{
QString path=QFileDialog::getOpenFileName(this,
"open","../"); //不指定格式
if(false==path)
{
QFile file(path);
//打开文件,只读方式打开
bool isOk=file.open(QIODevice::ReadOnly);
if(true==isOk)
{
//关联数据流,和file文件关联
//往数据流中输入数据,相当从往文件里读数据
QTextStream stream(&file);
//指定编码
stream.setCodec("UTF-8");
//
QString str = stream.readAll();
ui->textEdit->setText(str);
}
}
}