C++ Qt 文件读写操作详解:QFile与QTextStream两种方式
在基于 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 编程技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













