很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写、创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 wps office、pdfedit 等。为此,qt 框架提供了 qfile 类专门用来操作文件。
qfile 类支持对文件进行读取、写入、删除、重命名、拷贝等操作,它既可以操作文件文件,也可以操作二进制文件。
使用 qfile 类操作文件之前,程序中需引入<qfile>头文件。创建 qfile 类的对象,常用的构造函数有:
qfile::qfile()qfile::qfile(const qstring &name)
参数 name 用来指定要操作的目标文件,包含文件的存储路径和文件名,存储路径可以使用绝对路径(比如 “d:/demo/test.txt”)或者相对路径(比如”./demo/test.txt”),路径中的分隔触发器ppt符要用 “/” 表示。
通常情况下,我们会调用第二个构造函数,直接指明要操作的文件。对于第一个构造函数创建的 qfile 对象,需要再调用 tfilename() 方法指明要操作的文件。
与 c++ 读写文件的规则一样,使用 qfile 读写文件之前必须先打开文件,调用 open() 成员方法即可,常用的语法格式为:
bool qfile::open(openmode mode)
mode 参数用来指定文件的打开方式,下表罗列了此参数的可选值以及各自的含义:
表 1 qfile文件打开方式
根据需要,可以为 mode 参数一次性指定多个值,值和值之间用|分割。比如:
qiodevice::readonly | qiodevice::text:表示只允许对文件进行读操作,读取文件时,会将行尾结束符转换为 ‘\n’;qiodevice::writeonly | qiodevice::text:表示只允许对文件进行写操作,将数据写入文件时,会将行尾结束符转换为本地格式;qiodevice::readwrite | qiodevice::append | qiodevice::text:表示对文件进行写操作,写入的数据会存放到文件的尾部,同时数据中的行尾结束符转换为本地格式。注意,传递给 mode 参数的多个值之间不能相互冲突,比如 append 和 truncate 不能同时使用。
如果文件成功打开,open() 函数返回 true,否则返回 fal。
qfile 类提供了很多功能实用的方法,可以快速完成对文件的操作,下表列举了常用的一些:
copy 方法在执行复制操作之前,会关闭源文件。bool qfile::rename(const qstring &newname)对当前文件进行重命名,新名称为 newname,成功返回 true,失败返回 fal。bool qfile::remove()删除当前文件,成功返回 true,失败返回 fal。
表 2 qfile常用方法
【实例一】演示了 qfile 类读写文本文件的过程。
#include <qfile>#include <qdebug>int main(int argc, char *argv[]){ //创建 qfile 对象,同时指定要操作的文件 qfile file("d:/demo.txt"); //对文件进行写操作 if(!file.open(qiodevice::writeonly|qiodevice::text)){ qdebug()<<"文件打开失败"; } //向文件中写入两行字符串 file.write("c语言中文网\n"); file.write("http://c.biancheng.net"); //关闭文件 file.clo(); //重新打开文件,对文件进行读操作 if(!file.open(qiodevice::readonly|qiodevice::text)){ qdebug()<<"文件打开失败"; } //每次都去文件中的一行,然后输出读取到的字符串 char * str = new char[100]; qint64 readnum = file.readline(str,100); //当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取 while((readnum !=0) && (readnum != -1)){ qdebug() << str; readnum = file.readline(str,100); } file.clo(); return 0;}
执行程序,”c语言中文网” 和 “http://c.biancheng.net” 先写入 d 盘的 demo.txt 文件,然后再从文件中将它们读取出来。
【实例二】演示 qfile 读写二进制文件的过程。
#include <qfile>#include <qdebug>int main(int argc, char *argv[]){ //指定要写入文件的数据 qint32 nums[5]={1,2,3,4,5}; //写入文件之前,要将数据以二进制方式存储到字节数组中 qbytearray bytearr; bytearr.resize(sizeof(nums)); for(int i=0;i<5;i++){ //借助指针,将每个整数拷贝到字节数组中 memcpy(bytearr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32)); } //将 bytearr 字节数组存储到文件中 qfile file("d:/demo.dat"); file.open(qiodevice::writeonly); file.write(bytearr); file.clo(); //再次打开文件,读取文件中存储的二进制数据 file.open(qiodevice::readonly); qbytearray resarr = file.readall(); //输出读取到的二进制数据 qdebug()<<"resarr: "<<resarr; //将二进制数据转化为整数 char* data = resarr.data(); while(*data){ qdebug() << *(qint32*)data; data += sizeof(qint32); } return 0;}
执行程序,demo.dat 文件中会存储 {1,2,3,4,5} 这 5 个整数的二进制形式,同时输出以下内容:
resarr: “\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00”
1
2
3
4
5
单独使用 qfile 类读写文件的过程既繁琐又复杂,qt 提供了两个辅助类 qtextstream 和 qdatastream,前者用来读写文件文件,后者用来读写二进制文件,qfile 可以和它们搭配使用,从整体上提高读写文件的开发效率。
和单独使用 qfile 类读写文本文件相比,qtextstream 类提供了很多读写文件相关的方法,还可以设定写入到文件中的数据格式,比如对齐方式、写入数字是否带前缀等等。
使用 qtextstream 类之前,程序中要先引入<qtextstream>头文件。qtextstream 类提供了很多种构造函数,常用的是:
qtextstream(qiodevice *device)
qiodevice 是 qfile 的父类,因此在构造 qtextstream 类的对象时,需要传递一个 qfile 类的对象。
下表罗列了 qtextstream 类常用的一些方法:
表 3 qtextstream常用方法
qtextstream 类重载了>>输入运算符和>>输出运算符,使读写文本文件变得更简单。例如,用 qtextstream 实现【实例一】的程序如下:
#include <qfile>#include <qdebug>#include <qstring>#include <qtextstream>int main(int argc, char *argv[]){ //创建 qfile 对象,同时指定要操作的文件 qfile file("d:/demo.txt"); //对文件进行写操作 if(!file.open(qiodevice::writeonly|qiodevice::text)){ qdebug()<<"文件打开失败"; } qtextstream out(&file); //向文件中写入两行字符串 out << (qstring)"c语言中文家长的意见和建议网\n" << (qstring)"http://c.biancheng.net"; //关闭文件 file.clo(); //重新打开文件,对文研究生求职简历件进行读操作 if(!file.open(qiodevice::readonly|qiodevice::text)){ qdebug()<<"文件打开失败"; } qtextstream in(&file); //一直读,直至读取失败 while(!in.atend()){ qstring str; //从文件中读取一个字符串 in >> str; qdebug() << str; } file.clo(); return 0;}
和<iostream>类似,qtextstream 类提供了两种格式化输出的方法,一种是调用该类的成员方法,例如表 3 中的 tfieldalignment()、tfieldwidth 等,另一种是调用 qtextstream 类提供的格式描述符,下表罗列了常用的一些:
表 4 qtextstream常用格式描述符
举个简单的例子:
#include <qfile>#include <qdebug>#include <qstring>#include <qtextstream>int main(int argc, char *argv[]){ qfile file("d:/demo.txt"); if(!file.open(qiodevice::writeonly|qiodevice::text)){ qdebug()<<"文件打开失败"; } qtextstream out(&file); //将 10 的十六进制数写入文件 out << hex << 10; //设置每份数据占用 10 个字符的位置 out.tfieldwidth(10); //以右对齐的方式写入 3.14 蔡依林 锦荣 out << left << 3.14; //后续数据以左对齐的方式写入文件 out.tfieldalignment(qtextstream::alignright); out << 2.7; //关闭文件 file.clo(); return 0;}
程序运行后,demo.txt 存储的文本内容为:
a3.14 2.7
qdatastream 类的用法和 qtextstream 非常类似,最主要的区别在于,qdatastream 用于读写二进制文件。
使用 qdatastream 类之前,程序中要引入<qdatastream>头文件。创建 qdatastream 对象常用的构造函数为:
qdatastream::qdatastream(qiodevice *d)
下表罗列了 qdatastream 类常用的成员方法:
表 5 qdatastream常用方法
qdatastream 类也对<<和>>进行了重载,举个简单的例子,用 qdatastream 重新实现实例二:
#include <qfile>#include <qdebug>#include <qdatastream>int main(int argc, char *argv[]){ //指定要写入文件的数据 qint32 nums[5]={1,2,3,4,5}; qfile file("d:/demo.dat"); file.open(qiodevice::writeonly); //创建 qdatastream 对象 qdatastream out(&file); //将 nums 数组中的整数逐个写入到二进制文件中 for(int i=0;i<5;i++){ out << nums[i]; } file.clo(); //再次打开文件,读取文件中存储的二进制数据 file.open(qiodevice::readonly); qdatastream in(&file); //读取二进制文件中的数据 while(!in.atend()){ //每次读取一个整数 qint32 num; in >> num; qdebug() << num; } return 0;}
输出结果为:
1
2
3
4
5
到此这篇关于qt qfile文件操作的具体使用的文章就介绍到这了,更多相关qt qfile文件操作内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-03 23:18:34,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/d31da7337bf61b35db527539cafbb030.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Qt QFile文件操作的具体使用.doc
本文 PDF 下载地址:Qt QFile文件操作的具体使用.pdf
留言与评论(共有 0 条评论) |