Qt开发:文件(QFile)读写详解

一、QFile是什么?

  QFile 是 Qt 提供的跨平台文件处理类,它封装了对本地文件系统的访问。可以处理任意类型的文件,包括文本文件和二进制文件。由于它继承自 QIODevice,也就拥有了标准的输入输出设备接口,如 read(), write(), seek(), flush() 等。

类结构:

QObject
└── QIODevice
    └── QFile

常用函数说明:
在这里插入图片描述
打开模式(OpenMode):
在这里插入图片描述

二、QFile直接读写文件

写入文件

#include <QApplication>
#include <QFile>
#include <QDebug>

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

    QFile file("example.txt");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "无法打开文件写入:" << file.errorString();
        return -1;
    }

    qDebug() << "文件打开成功";

    file.write("hello world\n");
    file.write("hell qt");

    file.close();

    return a.exec();
}

打开并读取文本文件

#include <QApplication>
#include <QFile>
#include <QDebug>

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

    QFile file("example.txt");

	if (!file.exists()) {
        qDebug() << "文件不存在";
        return -1;
    }

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "无法打开文件写入:" << file.errorString();
        return -1;
    }

    qDebug() << "文件打开成功";

    while (!file.atEnd()) {
        QByteArray byteInfo = file.readLine().trimmed();
        qDebug() << byteInfo;

        /* 读取所有的数据 */
        //qDebug() << file.readAll();
    }

    file.close();

    return a.exec();
}

在这里插入图片描述

三、QFile读写二进制文件

写入二进制文件

#include <QApplication>
#include <QFile>
#include <QDebug>

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

    QByteArray binData;
    binData.append((char)0x42);
    binData.append((char)0x43);

    QFile file("BinaryByte.bin");
    if (!file.open(QIODevice::WriteOnly)) {
        qDebug() << "无法打开文件写入:" << file.errorString();
        return  -1;
    }

    file.write(binData);
    file.close();

    return a.exec();
}

读取二进制文件

#include <QApplication>
#include <QFile>
#include <QDebug>

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

    QFile file("BinaryByte.bin");

    if (!file.exists()) {
        qDebug() << "文件不存在";
        return -1;
    }

    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "无法打开文件写入:" << file.errorString();
        return  -1;
    }

    QByteArray byteArray = file.readAll();
    qDebug() << "byteArray:" << byteArray;
    file.close();

    return a.exec();
}

四、以结构体方式读写二进制文件

写入结构体:

#include <QApplication>
#include <QFile>
#include <QDebug>

#pragma pack(1)  // 保证没有字节对齐填充
struct MyData {
    int id;
    float value;
    char name[20];
};

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

    MyData d = {123, 45.67f, "QtTest"};
    QFile file("data.bin");
    if (!file.open(QIODevice::WriteOnly)) {
        qDebug() << "无法打开文件写入:" << file.errorString();
        return  -1;
    }

    file.write(reinterpret_cast<char*>(&d), sizeof(MyData));
    file.close();

    return a.exec();
}

读取结构体:

#include <QApplication>
#include <QFile>
#include <QDebug>

#pragma pack(1)  // 保证没有字节对齐填充
struct MyData {
    int id;
    float value;
    char name[20];
};

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

    MyData d;
    QFile file("data.bin");

    if (!file.exists()) {
        qDebug() << "文件不存在";
        return -1;
    }

    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "无法打开文件写入:" << file.errorString();
        return  -1;
    }

    file.read(reinterpret_cast<char*>(&d), sizeof(MyData));

    qDebug() << d.id << "," << d.value << "," << d.name ;

    file.close();

    return a.exec();
}

在这里插入图片描述

五、使用QDataStream读写文件

  QDataStream 是 Qt 提供的一个 用于读写二进制数据流的类,常与 QFile 一起使用,适合用来序列化和反序列化 Qt 类型(如 QString, QVector, QMap,甚至自定义结构体),比直接用 QFile::write/read 更安全、更灵活,还能跨平台保持一致性。

写入数据到文件:

#include <QApplication>
#include <QFile>
#include <QDataStream>
#include <QDebug>

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

    QFile file("DataStream.bin");
    if (!file.open(QIODevice::WriteOnly)) {
        qDebug() << "打开文件失败:" << file.errorString();
        return -1;
    }

    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_5_14);  // 设置Qt版本,确保兼容性

    int age = 25;
    QString name = "Alice";
    double score = 98.5;

    out << age << name << score;

    file.close();

    return a.exec();
}

从文件中读取数据:

#include <QApplication>
#include <QFile>
#include <QDataStream>
#include <QDebug>

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

    QFile file("DataStream.bin");
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "打开文件失败:" << file.errorString();
        return -1;
    }

    QDataStream in(&file);
    in.setVersion(QDataStream::Qt_5_14);

    int age;
    QString name;
    double score;

    in >> age >> name >> score;

    qDebug() << "姓名:" << name << "年龄:" << age << "分数:" << score;

    file.close();

    return a.exec();
}

在这里插入图片描述

六、使用QTextStream读写文件

  QTextStream 是 Qt 中专门用来处理文本文件读写的类,适合处理 QString、字符、数字等可读文本格式。相比 QDataStream 的二进制格式,QTextStream 写入的数据是可读的文本内容(比如 .txt, .csv, .json 等文本类文件)。

#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QDebug>

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

    QFile file("example.txt");
    if (!file.open(QIODevice::ReadWrite | QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "文件打开失败";

        return -1;
    }
 
    QTextStream stream(&file);

    /* 写入文件 */
    stream << "Hello World!" << Qt::endl;
    stream << 43 << Qt::endl;
    stream << 3.14  << Qt::endl;

    /* 将文件指针移动到文件开头 */
    file.seek(0);

    /* 读取文件 */
    QString line;
    while (!stream.atEnd()) {
        line = stream.readLine();
        qDebug() << line;
    }

    file.close();

    return a.exec();
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值