Qt QFile文件操作详解(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

| 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。 |

【实例一】演示了 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.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语言中文网” 和 “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.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: “\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

和单独使用 QFile 类读写文本文件相比,QTextStream 类提供了很多读写文件相关的方法,还可以设定写入到文件中的数据格式,比如对齐方式、写入数字是否带前缀等等。

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

QTextStream(QIODevice *device)

QIODevice 是 QFile 的父类,因此在构造 QTextStream 类的对象时,需要传递一个 QFile 类的对象。

下表罗列了 QTextStream 类常用的一些方法:
表 3 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 类提供的格式描述符,下表罗列了常用的一些:

表 4 QTextStream常用格式描述符 描述符 功能相同的方法 功 能

Qt::hexQTextStream::setIntegerBase(16)将指定整数对应的 16 进制数写入到文件中。
Qt::showbaseQTextStream::setNumberFlags(numberFlags()ShowBase)
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)居中对齐

举个简单的例子:

#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)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

15896096596)]
[外链图片转存中…(img-d6oWtnrF-1715896096596)]

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 的 QFile 类提供了一种方便的方式来访问和操作文件。它支持文件的读写、复制、移动、删除等操作。下面是 QFile 的一些常用方法和详细介绍。 1. 打开和关闭文件 QFile 可以通过构造函数或 open() 方法打开一个文件。例如: ```cpp QFile file("test.txt"); if (file.open(QIODevice::ReadOnly)) { // 文件打开成功,进行读取操作 file.close(); } ``` 在上面的例子中,我们使用了 `QIODevice::ReadOnly` 标志来指示文件只能读取,不能写入。其他可用的标志包括 `QIODevice::WriteOnly`、`QIODevice::ReadWrite`、`QIODevice::Append` 等。当文件打开成功后,我们需要在操作完成后使用 `close()` 方法关闭文件。 2. 读取文件内容 QFile 可以使用 `readAll()` 方法一次性读取整个文件的内容: ```cpp QFile file("test.txt"); if (file.open(QIODevice::ReadOnly)) { QByteArray data = file.readAll(); // 处理读取的数据 file.close(); } ``` 也可以使用 `read()` 方法读取部分文件内容: ```cpp QFile file("test.txt"); if (file.open(QIODevice::ReadOnly)) { QByteArray data = file.read(1024); // 处理读取的数据 file.close(); } ``` 其中,`1024` 表示要读取的字节数。如果需要一行一行地读取文件内容,可以使用 `readLine()` 方法: ```cpp QFile file("test.txt"); if (file.open(QIODevice::ReadOnly)) { while (!file.atEnd()) { QByteArray line = file.readLine(); // 处理读取的一行数据 } file.close(); } ``` 上面的代码片段将逐行读取文件的内容,直到文件末尾。 3. 写入文件内容 QFile 可以使用 `write()` 方法写入数据到文件中: ```cpp QFile file("test.txt"); if (file.open(QIODevice::WriteOnly)) { QByteArray data = "Hello, world!"; file.write(data); file.close(); } ``` 如果需要在文件末尾追加数据,可以使用 `QIODevice::Append` 标志打开文件,然后使用 `write()` 方法写入数据。 4. 复制、移动和删除文件 QFile 可以使用 `copy()` 方法复制文件: ```cpp QFile file("test.txt"); if (file.copy("copy.txt")) { // 文件复制成功 } ``` 可以使用 `rename()` 方法移动或重命名文件: ```cpp QFile file("test.txt"); if (file.rename("newname.txt")) { // 文件移动或重命名成功 } ``` 可以使用 `remove()` 方法删除文件: ```cpp QFile file("test.txt"); if (file.remove()) { // 文件删除成功 } ``` 以上是 QFile 类的一些常用方法,可以根据需要进行调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值