C++ Qt 文件读写操作详解:QFile与QTextStream两种方式

Jasper
Jasper
发布时间:2026-10-16 | 4人浏览过
原创

在基于 C++ 的 Qt 应用开发中,文件读写是基础且关键的功能。本文将详细解析两种主流的文件处理方案:直接使用 QFile 进行底层数据交换,以及结合 QTextStream 进行高效文本流处理。涵盖文件打开模式配置、编码自动检测及完整的代码实现。

基于 QFile 的直接读写操作

Qt 中的 QFile 类提供了访问文件的接口,它可以直接继承自 QIODevice,从而实现对文件的底层读写。这种方式适用于需要精确控制字节流或处理非文本数据的场景。

第1步:配置与初始化

在使用 QFile 之前,需引入必要的头文件。除了核心的 QFile 外,QString 用于处理路径和文本,QByteArray 用于存储字节数据,标准库 <iostream> 可用于控制台输出调试信息。

第2步:实现文件读取逻辑

读取文件时,首先通过 exists() 检查文件是否可用,随后调用 open() 以指定模式打开文件。readAll() 方法可将整个文件内容一次性加载至内存字符串中。操作完成后务必调用 close() 释放资源。

#include <QCoreApplication>
#include <iostream>
#include <QFile>
#include <QString>
#include <QTextStream>

// 一次读入所有文本
bool ReadFileOnly(const QString &file_path)
{
    QFile ptr(file_path);

    // 文件是否存在
    if(!ptr.exists())
    {
        return false;
    }

    // 文件是否打开
    /*
    ReadOnly   以只读方式打开
    WriteOnly  以只写方式打开
    ReadWrite  读写方式打开
    Append     以追加方式打开
    Truncate   以截取方式打开(原有内容被清空)
    Text       以文件方式打开
    */

    if(!ptr.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        return false;
    }

    QString text = ptr.readAll();
    std::cout << text.toStdString() << std::endl;
    ptr.close();
}

第3步:实现文件追加写入

当需要进行数据追加而非覆盖时,使用 QIODevice::Append 标志。通过 toUtf8() 将字符串转换为 QByteArray,再利用 write() 函数写入指定长度的字节数据。

// 追加写入文本
bool WriteFileOnly(const QString &file_path, QString save)
{
    // 如果参数为空则返回假
    if(file_path.isEmpty() && save.isEmpty())
    {
        return false;
    }

    QFile ptr(file_path);
    if(!ptr.open(QIODevice::Append | QIODevice::Text))
    {
        return false;
    }

    QByteArray str_bytes = save.toUtf8();

    ptr.write(str_bytes,str_bytes.length());
    ptr.close();
    return true;
}

QTextStream 流式文件处理

对于纯文本文件,推荐使用 QFile 配合 QTextStream。QTextStream 封装了底层的字节读写,提供了类似 C++ iostream 的操作符(如 <<),并支持自动解码和编码转换,大幅简化了文本处理的复杂度。

第1步:流对象绑定与编码设置

将 QTextStream 绑定到已打开的 QFile 对象上。为了正确处理中文等非 ASCII 字符,必须启用自动 Unicode 检测 setAutoDetectUnicode(true) 或在应用层面设置全局编码为 UTF-8。

第2步:逐行读取与计数

使用 readLine() 按行读取内容,并通过 atEnd() 判断是否到达文件末尾。此方法适合大文件处理,避免一次性占用过多内存。

第3步:流式追加写入实战

通过 << 运算符直接向流中注入字符串,QTextStream 会自动完成类型转换和编码映射。

#include <QCoreApplication>
#include <iostream>
#include <QFile>
#include <QString>
#include <QTextStream>
#include <QTextCodec>

// 计算文件行数
qint32 get_file_count(const QString &file_path)
{
    QFile ptr(file_path);
    qint32 count = 0;

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

        // 自动检测unicode编码,显示中文
        in.setAutoDetectUnicode(true);

        while(!in.atEnd())
        {
            QString line = in.readLine();
            std::cout << line.toStdString() << std::endl;
            count = count +1;
        }

        return count;
    }
    return 0;
}

// 追加写入数据
bool write_file_stream(const QString &file_path, QString save)
{
    QFile ptr(file_path);

    if(ptr.open(QIODevice::Append | QIODevice::Text))
    {
        QTextStream in(&ptr);
        in << save;
    }
    ptr.close();
    return true;
}

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

    // 设置编码
    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    QTextCodec::setCodecForLocale(codec);

    // 流写入
    write_file_stream("d://test.txt","hello lyshark");
    write_file_stream("d://test.txt","你好,世界");

    // 取文本长度
    qint32 count = get_file_count("d://test.txt");
    std::cout << "line = > " << count << std::endl;
    return a.exec();
}

文件打开模式详解

QFile::open() 函数依赖 QIODevice::OpenModeFlag 枚举来确定文件的访问权限和处理方式。理解这些标志是避免读写错误的关键。

  • QIODevice::ReadOnly:以只读方式打开文件,主要用于载入数据。
  • QIODevice::WriteOnly:以只写方式打开文件,通常用于保存新数据,若文件存在可能会截断原有内容。
  • QIODevice::ReadWrite:允许同时读取和写入文件。
  • QIODevice::Append:以追加模式打开,所有新写入的数据将放置在文件末尾,不会删除原有内容。
  • QIODevice::Truncate:打开文件时立即截断它,原有的所有内容将被删除。常与 WriteOnly 或 ReadWrite 组合使用。
  • QIODevice::Text:以文本方式打开。在读模式下,系统特定的行尾字符会自动转换为 '\n';在写模式下,'\n' 会自动转换回平台相关的编码(如 Windows 下的 "\r\n")。

这些标志可以通过位运算组合使用,例如 QIODevice::ReadOnly | QIODevice::Text 表示以只读且处理换行符的方式打开文件。

总结

QFile 提供了基础的 IO 能力,适合底层二进制操作;而 QTextStream 在此基础上增加了文本语义层,是处理配置文本、日志文件或用户输入数据的首选工具。根据实际需求选择直接字节读写或流式文本处理,可以显著提升开发效率并减少编码相关 bug。

以上就是 C++ Qt 文件读写操作的详细内容,更多关于 Qt 编程技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表