c/c++语言开发共享Qt QFile文件操作的具体使用

目录qfile文件操作qfile+qtextstreamqfile+qdatastream很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写、创建和删除文件等,甚至某些应用程序的诞生纯粹是

目录
  • qfile文件操作
  • qfile+qtextstream
  • qfile+qdatastream

很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写、创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 wps office、pdfedit 等。为此,qt 框架提供了 qfile 类专门用来操作文件。

qfile文件操作

qfile 类支持对文件进行读取、写入、删除、重命名、拷贝等操作,它既可以操作文件文件,也可以操作二进制文件。

使用 qfile 类操作文件之前,程序中需引入<qfile>头文件。创建 qfile 类的对象,常用的构造函数有:

  qfile::qfile()  qfile::qfile(const qstring &name)

参数 name 用来指定要操作的目标文件,包含文件的存储路径和文件名,存储路径可以使用绝对路径(比如 “d:/demo/test.txt”)或者相对路径(比如”./demo/test.txt”),路径中的分隔符要用 “/” 表示。

通常情况下,我们会调用第二个构造函数,直接指明要操作的文件。对于第一个构造函数创建的 qfile 对象,需要再调用 setfilename() 方法指明要操作的文件。

与 c++ 读写文件的规则一样,使用 qfile 读写文件之前必须先打开文件,调用 open() 成员方法即可,常用的语法格式为:

  bool qfile::open(openmode mode)

mode 参数用来指定文件的打开方式,下表罗列了此参数的可选值以及各自的含义:

打开方式 含 义
qiodevice::readonly 只能对文件进行读操作
qiodevice::writeonly 只能对文件进行写操作,如果目标文件不存在,会自行创建一个新文件。
qiodevice::readwrite 等价于 readonly | writeonly,能对文件进行读和写操作。
qiodevice::append 以追加模式打开文件,写入的数据会追加到文件的末尾(文件原有的内容保留)。
qiodevice::truncate 以重写模式打开,写入的数据会将原有数据全部清除。注意,此打开方式不能单独使用,通常会和 readonly 或 writeonly 搭配。
qiodevice::text 读取文件时,会将行尾结束符(unix 系统中是 “n”,windows 系统中是 “rn”)转换成‘n’;将数据写入文件时,会将行尾结束符转换成本地格式,例如 win32 平台上是‘rn’。

表 1 qfile文件打开方式

根据需要,可以为 mode 参数一次性指定多个值,值和值之间用|分割。比如:

  • qiodevice::readonly | qiodevice::text:表示只允许对文件进行读操作,读取文件时,会将行尾结束符转换为 ‘n’;
  • qiodevice::writeonly | qiodevice::text:表示只允许对文件进行写操作,将数据写入文件时,会将行尾结束符转换为本地格式;
  • qiodevice::readwrite | qiodevice::append | qiodevice::text:表示对文件进行写操作,写入的数据会存放到文件的尾部,同时数据中的行尾结束符转换为本地格式。

注意,传递给 mode 参数的多个值之间不能相互冲突,比如 append 和 truncate 不能同时使用。

如果文件成功打开,open() 函数返回 true,否则返回 false。

qfile 类提供了很多功能实用的方法,可以快速完成对文件的操作,下表列举了常用的一些:

普通成员方法 功 能
qint64 qfile::size() const 获取当前文件的大小。对于打开的文件,该方法返回文件中可以读取的字节数。
bool qiodevice::getchar(char *c) 从文件中读取一个字符,并存储到 c 中。读取成功时,方法返回 true,否则返回 false。
bool qiodevice::putchar(char c) 向文件中写入字符 c,成功时返回 true,否则返回 false。
qbytearray qiodevice::read(qint64 maxsize) 从文件中一次性最多读取 maxsize 个字节,然后返回读取到的字节。
qint64 qiodevice::read(char *data, qint64 maxsize) 从文件中一次性对多读取 maxsize 个字节,读取到的字节存储到 data 指针指定的内存控件中。该方法返回成功读取到的字节数。
qbytearray qiodevice::readall() 读取文件中所有的数据。
qint64 qiodevice::readline(char *data, qint64 maxsize) 每次从文件中读取一行数据或者读取最多 maxsize-1 个字节,存储到 data 中。该方法返回实际读取到的字节数。
qint64 qiodevice::write(const char *data, qint64 maxsize) 向 data 数据一次性最多写入 maxsize 个字节,该方法返回实际写入的字节数。 
qint64 qiodevice::write(const char *data) 将 data 数据写入文件,该方法返回实际写入的字节数。
qint64 qiodevice::write(const qbytearray &bytearray) 将 bytearray 数组中存储的字节写入文件,返回实际写入的字节数。
bool qfile::copy(const qstring &newname) 将当前文件的内容拷贝到名为 newname 的文件中,如果成功,方法返回 true,否则返回 false。

copy 方法在执行复制操作之前,会关闭源文件。

bool qfile::rename(const qstring &newname)对当前文件进行重命名,新名称为 newname,成功返回 true,失败返回 false。
bool qfile::remove()删除当前文件,成功返回 true,失败返回 false。

表 2 qfile常用方法

【实例一】演示了 qfile 类读写文c/c++开发分享Qt 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("https://c.biancheng.net");      //关闭文件      file.close();        //重新打开文件,对文件进行读操作      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.close();      return 0;  }

执行程序,”c语言中文网” 和 “https://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.close();        //再次打开文件,读取文件中存储的二进制数据      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:  “x01x00x00x00x02x00x00x00x03x00x00x00x04x00x00x00x05x00x00x00”

1

2

3

4

5

单独使用 qfile 类读写文件的过程既繁琐又复杂,qt 提供了两个辅助类 qtextstream 和 qdatastream,前者用来读写文件文件,后者用来读写二进制文件,qfile 可以和它们搭配使用,从整体上提高读写文件的开发效率。

qfile+qtextstream

和单独使用 qfile 类读写文c/c++开发分享Qt QFile文件操作的具体使用件相比,qtextstream 类提供了很多读写文件相关的方法,还可以设定写入到文件中的数据格式,比如对齐方式、写入数字是否带前缀等等。

使用 qtextstream 类之前,程序中要先引入<qtextstream>头文件。qtextstream 类提供了很多种构造函数,常用的是:

  qtextstream(qiodevice *device)

qiodevice 是 qfile 的父类,因此在构造 qtextstream 类的对象时,需要传递一个 qfile 类的对象。

下表罗列了 qtextstream 类常用的一些方法:

成员方法 功 能
bool qtextstream::atend() const 判断是否读到文件末尾,如果已经达到末尾,返回 true,否则返回 false。
qstring qtextstream::read(qint64 maxlen) 从文件中读最多 maxlen 个字符,返回这些字符组成的 qstring 字符串。
qstring qtextstream::readall() 从文件中读取所有内容,返回由读取内容组成的 qstring 字符串。
qstring qtextstream::readline(qint64 maxlen = 0) 默认读取一行文本,如果手动指定 maxlen 的值,则最多读取 maxlen 个字符,并返回读取内容组成的 qstring 字符串。
void qtextstream::setfieldalignment(fieldalignment mode) 设置对齐方式,通常与 setfieldwidth() 一起使用。
void qtextstream::setfieldwidth(int width) 设置每份数据占用的位置宽度为 width。

表 3 qtextstream常用方法

qtextstream 类重载了>>输入运算符和>>输出运算符,使读写文c/c++开发分享Qt QFile文件操作的具体使用件变得更简单。例如,用 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)"https://c.biancheng.net";      //关闭文件      file.close();        //重新打开文件,对文件进行读操作      if(!file.open(qiodevice::readonly|qiodevice::text)){          qdebug()<<"文件打开失败";      }      qtextstream in(&file);      //一直读,直至读取失败      while(!in.atend()){          qstring str;          //从文件中读取一个字符串          in >> str;          qdebug() << str;      }      file.close();      return 0;  }

和<iostream>类似,qtextstream 类提供了两种格式化输出的方法,一种是调用该类的成员方法,例如表 3 中的 setfieldalignment()、setfieldwidth 等,另一种是调用 qtextstream 类提供的格式描述符,下表罗列了常用的一些:

描述符 功能相同的方法 功 能
qt::hex qtextstream::setintegerbase(16) 将指定整数对应的 16 进制数写入到文件中。
qt::showbase qtextstream::setnumberflags(numberflags() | showbase) 对于非十进制数,写入到文件中时带上相应的前缀。二进制数前缀是 0b,八进制数前缀是 0,十六进制数前缀是 0x。
qt::forcesign qtextstream::setnumberflags(numberflags() | forcesign) 将数字写入文件时,带上正负号。
qt::fixed qtextstream::setrealnumbernotation(fixednotation) 将浮点数以普通小数的形式写入文件。
qt::scientific qtextstream::setrealnumbernotation(scientificnotation) 将浮点数以科学计数法的形式写入文件。
qt::left qtextstream::setfieldalignment(alignleft) 左对齐
qt::right qtextstream::setfieldalignment(alignright) 右对齐
qt::center qtextstream::setfieldalignment(aligncenter) 居中对齐

表 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.setfieldwidth(10);      //以右对齐的方式写入 3.14      out << left << 3.14;      //后续数据以左对齐的方式写入文件      out.setfieldalignment(qtextstream::alignright);      out << 2.7;      //关闭文件      file.close();      return 0;  }

程序运行后,demo.txt 存储的文本内容为:

a3.14             2.7

qfile+qdatastream

qdatastream 类的用法和 qtextstream 非常类似,最主要的区别在于,qdatastream 用于读写二进制文件。

使用 qdatastream 类之前,程序中要引入<qdatastream>头文件。创建 qdatastream 对象常用的构造函数为:

qdatastream::qdatastream(qiodevice *d)

下表罗列了 qdatastream 类常用的成员方法:

成员方法 功 能
bool qdatastream::atend() const 判断是否读到文件末尾,如果已经达到末尾,返回 true,否则返回 false。
qdatastream &qdatastream::readbytes(char *&s, uint &l) 对于用 writebytes() 方法写入文件的 l 和 s,只能使用 readbytes() 方法读取出来。 
int qdatastream::readrawdata(char *s, int len) 从文件中读取最多 len 字节的数据到 s 中,返回值表示实际读取的字节数。注意,调用该方法之前,需要先给 s 参数分配好内存空间。
void qdatastream::setversion(int v) 不同版本的 qt 中,同名称的数据类型也可能存在差异,通过调用此方法手动指定版本号,可以确保读取数据的一致性。
int qdatastream::skiprawdata(int len) 跳过文件中的 len 个字节,返回实际跳过的字节数。
qdatastream &qdatastream::writebytes(const char *s, uint len) 将长度 len 和 s 一起写入到文件中,对于 writebytes() 写入的数据,只能用 readbytes() 方法读取。
int qdatastream::writerawdata(const char *s, int len) 将 s 中前 len 字节的数据写入文件,返回值表示成功写入的字节数。

表 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.close();        //再次打开文件,读取文件中存储的二进制数据      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.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享Qt QFile文件操作的具体使用,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/965288.html

(0)
上一篇 2021年12月2日
下一篇 2021年12月2日

精彩推荐