当前位置: 首页 > news >正文

Qt之Qfile类

欢迎来到 破晓的历程的 博客

⛺️不负时光,不负己✈️

文章目录

    • 1.引言
    • 2.QFile文件操作
    • 3.演示示例
      • 3.1实验一
      • 3.2实验二【演示 QFile 读写二进制文件的过程】
    • 4.QFile+QTextStream
    • 5.QFile+QDataStream

1.引言

很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件等等,甚至某些应用程序的就是为了操作文件,像WPS Office。基于此Qt框架中专门提供了对文件操作的类:QFile。

2.QFile文件操作

QFile类支持对文件进行读取和写入,删除,重命名,拷贝等常见的文件操作,它既可以操作文本文件,也可以用来操作二进制文件。

在Qt代码中我们使用QFIle类,需要先引入QFile的头文件:#include <QFile>。常见QFile类对象时,常见的构造函数有:

QFile()
QFile(QObject *parent)

参数parent 用来指定要操作的目标文件,包含文件的存储目录和文件名,存储路径可以使用绝对地址(比如"D:/Demo/text.txt")或者相对路径(比如"./Demo/text.txt")。路径中的分隔符要用"/"表示。

通常情况下,我们一般调用第二个构造函数来直接指明要操作的文件,对于第一个构造函数而言,我们还需要调用 setFileName()函数来指明要操作的文件。

与C++的读写规则一样,在对文件进行相关操作之前,我们需要先打开文件,打开文件我们使用 open函数。常用的语法格式为:

bool QFile::open(OpenMode Mode);

Mode参数表示不同的打开方式,下列罗列了参数的可选值和及其不同的含义:

打开模式含义
QIODevice::ReadOnly以只读模式打开文件。
QIODevice::WriteOnly以只写模式打开文件。如果文件不存在,将创建新文件;如果文件已存在,其内容将被清空。
QIODevice::ReadWrite以读写模式打开文件。
QIODevice::Append以追加模式打开文件,写入的数据将追加到文件末尾,原有内容保留。
QIODevice::Truncate打开文件时清空其内容。通常与 WriteOnlyReadWrite 一起使用。
QIODevice::Text在文本模式下打开文件,处理不同平台的行结束符(如将 Windows 的 \r\n 转换为 \n)。
QIODevice::Unbuffered以非缓冲模式打开文件,数据将直接写入磁盘而不经过缓冲区。

根据需要我们可以一次性选择多个值,值和值之前使用 |来进行分割,比如:

QIODevice::ReadOnly|QIODevice::Text表示只允许对文件进行读操作,读取文件时,会将行尾结束符转换为 ‘\n’;

QIODevice::WriteOnly|QIODevice::Text表示只允许对文件进行写操作,将数据写入文件时,会将行尾结束符转换为本地格式;

QIODevice::ReadWrite|QIODevice::Text| QIODevice::Append

但选择的多个值之前不能相互冲突,比如比如 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。

3.演示示例

3.1实验一

img

演示了 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("hello\r\n");file.write("world");//关闭文件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;
}

3.2实验二【演示 QFile 读写二进制文件的过程】

img
#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 个整数的二进制形式,同时输出以下内容:

image-20250514104431780

4.QFile+QTextStream

与单独使用QFile类相比,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。

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.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::hexQTextStream::setIntegerBase(16)将指定整数对应的 16 进制数写入到文件中。
Qt::showbaseQTextStream::setNumberFlags(numberFlags() | ShowBase)对于非十进制数,写入到文件中时带上相应的前缀。二进制数前缀是 0b,八进制数前缀是 0,十六进制数前缀是 0x。
Qt::forcesignQTextStream::setNumberFlags(numberFlags() | ForceSign)将数字写入文件时,带上正负号。
Qt::fixedQTextStream::setRealNumberNotation(FixedNotation)将浮点数以普通小数的形式写入文件。
Qt::scientificQTextStream::setRealNumberNotation(ScientificNotation)将浮点数以科学计数法的形式写入文件。
Qt::leftQTextStream::setFieldAlignment(AlignLeft)左对齐
Qt::rightQTextStream::setFieldAlignment(AlignRight)右对齐
Qt::centerQTextStream::setFieldAlignment(AlignCenter)居中对齐

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

a3.14 2.7

5.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 字节的数据写入文件,返回值表示成功写入的字节数。

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;
}

相关文章:

  • 用HBuilder运行小程序到微信开发者工具
  • 【​​HTTPS基础概念与原理​】​​HTTPS vs HTTP:为什么现代网站必须用HTTPS?
  • [目标检测] YOLO系列算法讲解
  • Manus逆向工程:AI智能体的“思考”与“行动”
  • Nginx 反向代理 静态文件404异常处理
  • 【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发
  • MySQL知识点总结(持续更新)
  • 企业数字化转型背景下的企业知识管理挑战与经验杂谈
  • GTM4.1-CCM
  • ARM杂谈——临界段保护恢复的中断状态可靠吗
  • 【解析:新能源汽车芯片主要玩家及技术发展】
  • 码题集——魔数、A的B次方、网球比赛、三角形、点与线段的关系
  • 数据清洗的艺术:如何为AI模型准备高质量数据集?
  • ACM算法
  • redis 缓存穿透,缓存击穿,缓存雪崩
  • LeetCode Hot100 (1/100)
  • 数据科学和机器学习的“看家兵器”——pandas模块 之一
  • flutter 视频通话flutter_webrtc
  • 【网络编程】八、Cookie Session 抓包原理
  • 火山引擎实时音视频 高代码跑通日志
  • 哪种“网红减肥法”比较靠谱?医学专家和运动专家共同解答
  • 国台办:80年前台湾重归中国版图,80年后不可能让台湾分裂出去
  • 王毅谈中拉论坛第四届部长级会议重要共识
  • 某博主遭勒索后自杀系自导自演,成都警方立案调查
  • 盖茨说对中国技术封锁起到反作用
  • 总没胃口,一吃就饱……别羡慕,也可能是生病了