Qt中的文件操作

Qt QFile文件操作详解 Qt QFile文件操作详解 很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写、创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 WPS Office、PDFedit 等。为此,Qt 框架提供了 QFile 类专门用来操作文件。 QFile文件操作 QFile 类支持对文件进行读取、写入、删除、重命名、拷贝等操作,它既可以操作文件文件,也可以操作二进制文件。 使用 QFile 类操作文件之前,程序中需引入头文件。创建 QFile 类的对象,常用的构造函数有: QFile::QF 阅读详情

1 文件读写类

1.1 QFile

QFile简介:

  • QFile是Qt中用于文件操作的类。
  • QFile对象对应到计算机上的一个文件。

疑问:如何使用ReadWrite对文件进行操作呢?先放在这里。

在这里插入图片描述
文本文件和数据文件:

Qt中将文件类型分为2大类:

  • 文本文件:文件内容是可读的文本字符。
  • 数据文件:文件内容是直接的二进制数据。

QFile直接支持文本文件和数据文件的读写:
在这里插入图片描述
思考:如何将一个浮点数据写入文本文件和数据文件?

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("C:/Users/hp/Desktop/test.hex");

    if( file.open(QIODevice::WriteOnly) )	// 不指明就是二进制文件
    {
        QString dt = "D.T.Software";
        double value = 3.14;

        file.write(dt.toStdString().c_str());
        file.write(reinterpret_cast<char*>(&value), sizeof(value));

        file.close();
    }

    if( file.open(QIODevice::ReadOnly) )
    {
        QString dt = "";
        double value = 0;

        dt = QString(file.read(12));
        file.read(reinterpret_cast<char*>(&value), sizeof(value));

        file.close();

        qDebug() << dt;
        qDebug() << value;
    }
    
    return a.exec();
}

可以看到上面的写入是很麻烦的,并且对于文件写入来说都是讲一段内存空间中的数据写入文件中,而不区分文本文件和数据文件。

为了方便的对文本文件和数据文件,我们可以借助QTextStream和QDataStream。

1.2 QTextStream和QDataStream

Qt提供辅助类简化了文本文件/数据文件的读写:

  • QTextStream:写入的数据全部转换为可读文本。
  • QDataStream:写入的数据根据类型转换为二进制数据。

IO设备辅助类的使用方式:
在这里插入图片描述
编程实验:使用文件辅助类读写

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDataStream>
#include <QDebug>

void text_stream_test(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
        QTextStream out(&file);

        out << QString("D.T.Software") << endl;
        out << QString("Result: ") << endl;
        out << 5 << '*' << 6 << '=' << 5 * 6 << endl;

        file.close();
    }

    if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        QTextStream in(&file);

        while( !in.atEnd() )
        {
            QString line = in.readLine();

            qDebug() << line;
        }

        file.close();
    }
}

void data_stream_test(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly) )
    {
        QDataStream out(&file);

        out.setVersion(QDataStream::Qt_4_7);

        out << QString("D.T.Software");
        out << QString("Result: ");
        out << 3.14;

        file.close();
    }

    if( file.open(QIODevice::ReadOnly) )
    {
        QDataStream in(&file);
        QString dt = "";
        QString result = "";
        double value = 0;

        in.setVersion(QDataStream::Qt_4_7);

        in >> dt;
        in >> result;
        in >> value;

        file.close();

        qDebug() << dt;
        qDebug() << result;
        qDebug() << value;
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    text_stream_test("C:/Users/hp/Desktop/text.txt");
    data_stream_test("C:/Users/hp/Desktop/data.dat");
    
    return a.exec();
}

对于QDataStream来说,不管写入的是QString、C方式的字符串、整形数据等,都有特定的二进制流格式,所以读取的时候才能直接以类型来进行读取。不是任何对象都能使用QDataStream进行序列化的,要想序列化必须自己实现序列化的方法。有很多Qt提供的类都实现了序列化的方法,比如对于QString如下(太长了我才不看):

#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
/*!
    \fn QDataStream &operator<<(QDataStream &stream, const QString &string)
    \relates QString

    Writes the given \a string to the specified \a stream.

    \sa {Serializing Qt Data Types}
*/

QDataStream &operator<<(QDataStream &out, const QString &str)
{
    if (out.version() == 1) {
        out << str.toLatin1();
    } else {
        if (!str.isNull() || out.version() < 3) {
            int byteOrder = out.byteOrder();
            const QChar* ub = str.unicode();
            static const uint auto_size = 1024;
            char t[auto_size];
            char *b;
            if (str.length()*sizeof(QChar) > auto_size) {
                b = new char[str.length()*sizeof(QChar)];
            } else {
                b = t;
            }
            int l = str.length();
            char *c=b;
            while (l--) {
                if (byteOrder == QDataStream::BigEndian) {
                    *c++ = (char)ub->row();
                    *c++ = (char)ub->cell();
                } else {
                    *c++ = (char)ub->cell();
                    *c++ = (char)ub->row();
                }
                ub++;
            }
            out.writeBytes(b, sizeof(QChar)*str.length());
            if (str.length()*sizeof(QChar) > auto_size)
                delete [] b;
        } else {
            // write null marker
            out << (quint32)0xffffffff;
        }
    }
    return out;
}

/*!
    \fn QDataStream &operator>>(QDataStream &stream, QString &string)
    \relates QString

    Reads a string from the specified \a stream into the given \a string.

    \sa {Serializing Qt Data Types}
*/

QDataStream &operator>>(QDataStream &in, QString &str)
{
#ifdef QT_QSTRING_UCS_4
#if defined(Q_CC_GNU)
#warning "operator>> not working properly"
#endif
#endif

    if (in.version() == 1) {
        QByteArray l;
        in >> l;
        str = QString::fromLatin1(l);
    } else {
        quint32 bytes = 0;
        in >> bytes;                                  // read size of string
        if (bytes == 0xffffffff) {                    // null string
            str.clear();
        } else if (bytes > 0) {                       // not empty
            if (bytes & 0x1) {
                str.clear();
                in.setStatus(QDataStream::ReadCorruptData);
                return in;
            }

            const quint32 Step = 1024 * 1024;
            quint32 len = bytes / 2;
            quint32 allocated = 0;

            while (allocated < len) {
                int blockSize = qMin(Step, len - allocated);
                str.resize(allocated + blockSize);
                if (in.readRawData(reinterpret_cast<char *>(str.data()) + allocated * 2,
                                   blockSize * 2) != blockSize * 2) {
                    str.clear();
                    in.setStatus(QDataStream::ReadPastEnd);
                    return in;
                }
                allocated += blockSize;
            }

            if ((in.byteOrder() == QDataStream::BigEndian)
                    != (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
                ushort *data = reinterpret_cast<ushort *>(str.data());
                while (len--) {
                    *data = qbswap(*data);
                    ++data;
                }
            }
        } else {
            str = QLatin1String("");
        }
    }
    return in;
}
#endif // QT_NO_DATASTREAM

不同版本的数据流文件格式可能不同,我们可以通过如下函数进行设置:
在这里插入图片描述
当数据流文件可能在不同版本的Qt程序间传递数据时,我们需要考虑版本问题!


2 文件辅助类

2.1 QFileInfo

QFileInfo类用于读取文件属性信息。

在这里插入图片描述
示例程序:

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QByteArray>
#include <QDebug>
#include <QFileInfo>
#include <QDateTime>

void write(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
        file.write("D.T.Software\n");
        file.write("Delphi Tang\n");
        file.close();
    }
}

void read(QString f)
{
    QFile file(f);

    if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        QByteArray ba = file.readLine();
        QString s(ba);

        qDebug() << s;

        file.close();
    }
}

void info(QString f)
{
    QFile file(f);
    QFileInfo info(file);

    qDebug() << info.exists();
    qDebug() << info.isFile();
    qDebug() << info.isReadable();
    qDebug() << info.isWritable();
    qDebug() << info.created();
    qDebug() << info.lastRead();
    qDebug() << info.lastModified();
    qDebug() << info.path();
    qDebug() << info.fileName();
    qDebug() << info.suffix();
    qDebug() << info.size();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    write("C:/Users/hp/Desktop/test.txt");
    read("C:/Users/hp/Desktop/test.txt");
    info("C:/Users/hp/Desktop/test.txt");
    
    return a.exec();
}


3 临时文件类

3.1 QTemporaryFile

Qt中提供了临时文件操作类QTemporaryFile:

  • 安全地创建一个全局唯一的临时文件。
  • 当对象销毁时对应的临时文件将被删除。
  • 临时文件的默认打开方式为QIODevice::ReadWrite。
  • 临时文件常用于大数据传递或者进程间通信的场合。

在这里插入图片描述
示例程序:

#include <QtCore/QCoreApplication>
#include <QTemporaryFile>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTemporaryFile tempFile;

    if( tempFile.open() )
    {
        tempFile.write("D.T.Software");
        tempFile.close();
    }

    QFileInfo info(tempFile);

    qDebug() << info.isFile();
    qDebug() << info.path();
    qDebug() << info.fileName();
    
    return a.exec();
}


参考资料:

  1. QT实验分析教程
Qt文件操作 Qt提供了跨平台的文件操作能力,核心类包括QIODevice(I/O设备抽象基类)、QFile(本地文件读写)、QTemporaryFile(临时文件)等。QFile支持随机访问,提供文件打开、读写、关闭等功能,可与QTextStream或QDataStream配合使用。文件操作模式包括ReadOnly、WriteOnly、ReadWrite等,支持文本和二进制处理。此外,QFileInfo可获取文件属性信息,QFile还提供静态方法实现文件删除、重命名等操作。开发者需注意路径分隔符使用"/&qu 阅读详情

相关推荐

(十九)Qt中的文件操作

Qt中的I/O操作 1、Qt通过统一的接口简化了文件与外部设备的操作方式 2、Qt中的文件被看作一种特殊的外部设备 3、Qt中的文件操作与外部操作相同(Qt通过统一的方式读写文件和外部设备) 4、QIODevice类是所有输入输出IO类的基类,为IO类提供了统一的调用接口   I/O操作中的关键函数接口(I/O操作的本质:连续存储空间的数据读写) 1、打开设备:

早起的虫儿灬 905

QT中的文件操作

QSaveFile是用于在写文件时,自动的把写的内容先写到临时文件中,不会破坏原有的文件,等写入操作完成后,将旧的文件删除,用新的文件替换旧的文件。创建一个继承自QWidget的文件,在ui界面创建一个按钮,通过点击按钮弹出打开文件对话框,获取文件路径,通过文件路径创建QFileInfo类。但是Qt同样封装了自己的一套文件操作,,在编写Qt程序时,推荐使用Qt自己提供的文件操作,和Qt的容器(如Qstring等)更加适配、通过菜单栏实现文件的打开,保存,通过多行编辑框实现文件的数据的写入和显示。

m0_73933978的博客 1184

QT基础教程(QT中的文件操作)

本篇文章我们来讲解QT中的文件操作,文件操作对于QT来说是非常重要的一个点,那么下面的话将给大家详细的讲解QT中的文件操作。本篇文章就讲解到这里。

m0_49476241的博客 7740

Qt 第32课、Qt 中的文件操作

文本编辑器涉及到文本的保存和文本的读取,所以今天学习 Qt 中的文件操作。 1、Qt 中的 IO 操作 Qt 中 IO操作的处理方式 — Qt 通过统一的接口简化了文本与外部设备的操作方式 — Qt 中的文件被看作一种特殊的外部设备 — Qt 中的文件操作与外部设备的操作相同 IO 操作中的关键函数接口 IO 操作的本质:连续存储空间的数据读写 Qt 中 IO 设备的类型 — 顺序存...

大大怪将军的博客 500

十一、学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

ungoing的博客 8991

Sonatype nexus3 数据迁移及升级3.71+(迁移到H2数据库)

nexus3旧版本OrientDB升级H2,及整体迁移nexus3数据到其它服务器。

葫芦娃 5554

用 QFileDialog 创建文件:Qt 开发中的文件操作指南

Qt 是一个跨平台的 C++ 应用程序开发框架,由奇趣科技公司开发,现由 Qt Company 维护。它提供了丰富的 API 函数库,涵盖图形界面开发、网络通信、数据库访问等多个领域,大大简化了应用程序的开发过程。Qt 拥有商业版和免费开源版,对于学习者和小型项目开发者而言,免费开源版足以满足学习和实践需求。QFileDialog 类是 Qt 中用于文件选择和打开、保存操作的关键类。

m0_57836225的博客 987

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 520

Qt--软件开发流程简介、Qt中的文件操作

一.软件开发流程 Q.什么是软件开发流程?1.通过一系列步骤保证软件的顺利完成2.软件产品在生命期内的管理方法学软件开发流程的本质1.开发流程与具体技术无关2.开发流程是开发团队必须遵守的规则常见的开发流程--即兴、瀑布、增量、螺旋、敏捷等A.即兴模型1.与最终用户交流后立即开始进行开发2.没有需求分析和需求发掘的过程3.没有整体设计以及规划的过程4.没有相关软件文档,维护性差B.瀑布模型1.通过...

cangnuan2978的博客 749

【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机(ubantu18.04@Intel 82545EM

如果之前添加了网卡,这里就可以看见有3个网卡(没添加的现在再加也行),* Active *为Linux内核正在使用的网卡,另外两张是未启用的网卡(注:未启用的网卡在终端中使用ifconfig命令是查不到的,需要先使用ip addr找出网卡,再激活,此时网卡会变为* Active *状态。

lingshengxiyou的博客 2130

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3408

Qt 中的文件操作

目录 1、Qt中的IO操作 2、Qt中的文件操作(QFile、QFileInfo、QTemporaryFile) 1、QFile、QFileInfo 2、QTemporaryFile 3、文本流和数据流(QTextStream和QDataStream) 1、文件类型 2、文本流和数据流 4、缓冲区操作与目录操作(QBuffer、QDir和QFileSystemWatcher)...

洋葱汪的博客 7883

SXU-软件项目管理-朱少民-第九章 项目监控与控制 第十章 项目收尾 附相关习题

软件项目管理-朱少民-第九章 项目监控与控制 附相关习题

weixin_63597914的博客 1488

32、qt中的文件操作+

32qt中的文件操作+ qt中io操作的处理方式:(类似linux思想外部设备:一切皆文件) qt通过统一的接口简化了文件与外部设备的操作方式,qt中的文件被看做一种特殊的外部设备,qt中的文件操作与外部设备的操作相同。 统一的IO操作方式 io操作中的关键函数接口: 打开设备:bool open(OpenMode mode) 读取数据:QByteArray read(qint64 ma...

WS857707645的博客 2196

(27)FPGA实现AD7768接口(六)

AD7768/AD7768-4 为8通道和4通道24位同步采样模数转换器(ADC)。通过可选的功耗模式和数字滤波器选项可重新配置AD7768/AD7768-4以适应多种应用,如工业输入/输出模块、仪器仪表、音频测试、控制回路和状态监控。FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。

m0_46498597的博客 997

SerDes系列之FFE均衡技术

FFE的基本结构可以在RX侧或TX侧实现,其基本工作原理相同:它通过从同一信号源应用适当的延迟来产生多径信号,然后对它们进行线性缩放和组合以消除信道ISI。

一只豌豆象的博客 4243

Qt中的基本文件操作

常用类:Qfile Qtextstream Qdatastream Qfiledialog Qiodeive 先实例化一个Qfile对象file,file(),括号内为文件名,默认为当前路径。 文件可以用open()来打开、用close()来关闭、用flush()来刷新。 file.open(Qiodeive::readonly)这里是打开方式,当然还有writeonly readwrit

Galwayy的博客 2780

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: Qt中的IO操作
下一篇: 临界区保护
SlowIsFastLemon
博客等级 码龄8年 265粉丝 790原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值