Qt文本文件读写方法详解

在Qt中,读写文本文件主要通过 QFileQTextStream 类实现。以下是各种方法的详细说明及示例代码:


1. 使用 QFile 和 QTextStream 读写文本

1.1 读取整个文件
cpp 复制代码
QFile file("example.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    qDebug() << "无法打开文件:" << file.errorString();
    return;
}
QTextStream in(&file);
QString content = in.readAll(); // 读取所有内容
file.close();
1.2 逐行读取文件
cpp 复制代码
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    QTextStream in(&file);
    while (!in.atEnd()) {
        QString line = in.readLine(); // 逐行读取
        qDebug() << line;
    }
    file.close();
}
1.3 写入文件(覆盖模式)
cpp 复制代码
QFile file("output.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    QTextStream out(&file);
    out << "第一行内容\n";
    out << "第二行内容";
    file.close();
}
1.4 追加写入文件
cpp 复制代码
QFile file("output.txt");
if (file.open(QIODevice::Append | QIODevice::Text)) {
    QTextStream out(&file);
    out << "\n追加的内容";
    file.close();
}
1.5 设置编码格式
cpp 复制代码
QTextStream stream(&file);
stream.setEncoding(QStringConverter::Utf8); // Qt6+ 设置UTF-8
// 或 stream.setCodec("UTF-8"); // Qt5

2. 使用 QFile 直接读写(基于 QByteArray)

2.1 读取为 QByteArray
cpp 复制代码
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly)) {
    QByteArray data = file.readAll();
    QString content = QString::fromUtf8(data); // 转为QString
    file.close();
}
2.2 写入 QByteArray
cpp 复制代码
QFile file("output.txt");
if (file.open(QIODevice::WriteOnly)) {
    QByteArray data = "Hello, Qt!".toUtf8();
    file.write(data);
    file.close();
}

3. 其他注意事项

3.1 文件打开模式
  • QIODevice::ReadOnly:只读
  • QIODevice::WriteOnly:覆盖写入
  • QIODevice::Append:追加写入
  • QIODevice::Text:自动处理换行符(\n 转换为平台相关换行符)
3.2 错误处理

检查文件是否成功打开:

cpp 复制代码
if (!file.open(...)) {
    qDebug() << "错误:" << file.errorString();
}
3.3 大文件处理

逐块读取以避免内存占用过高:

cpp 复制代码
QFile file("largefile.txt");
if (file.open(QIODevice::ReadOnly)) {
    while (!file.atEnd()) {
        QByteArray chunk = file.read(1024); // 每次读取1KB
        // 处理chunk...
    }
    file.close();
}

4. 完整示例:读写文件操作

cpp 复制代码
#include <QFile>
#include <QTextStream>
#include <QDebug>

void readWriteDemo() {
    // 写入文件
    QFile writeFile("test.txt");
    if (writeFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream out(&writeFile);
        out << "姓名:张三\n年龄:25";
        writeFile.close();
    }

    // 读取文件
    QFile readFile("test.txt");
    if (readFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QTextStream in(&readFile);
        qDebug() << "文件内容:\n" << in.readAll();
        readFile.close();
    }
}

5. 高级用法

  • QSaveFile :安全写入文件(原子操作,避免写入中途崩溃导致数据丢失):

    cpp 复制代码
    QSaveFile saveFile("important.txt");
    if (saveFile.open(QIODevice::WriteOnly)) {
        QTextStream out(&saveFile);
        out << "安全保存的内容";
        saveFile.commit(); // 只有commit才会替换原文件
    }

总结

  • QTextStream:推荐用于文本处理(自动处理编码和换行符)。
  • QFile + QByteArray:适合直接操作字节数据或二进制文件。
  • 根据需求选择覆盖(WriteOnly)或追加(Append)模式。
  • 始终检查文件是否成功打开,并处理异常情况。
相关推荐
麦兜*1 小时前
Swift + Xcode 开发环境搭建终极指南
开发语言·ios·swiftui·xcode·swift·苹果vision pro·swift5.6.3
Coovally AI模型快速验证2 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
mit6.8242 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
pusue_the_sun2 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
萧鼎2 小时前
Python pyzmq 库详解:从入门到高性能分布式通信
开发语言·分布式·python
RaymondZhao343 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
艾伦~耶格尔3 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
zhangfeng11333 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
yujkss3 小时前
Python脚本每天爬取微博热搜-终版
开发语言·python
yzx9910133 小时前
小程序开发APP
开发语言·人工智能·python·yolo