在Qt中,读写文本文件主要通过 QFile
和 QTextStream
类实现。以下是各种方法的详细说明及示例代码:
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 :安全写入文件(原子操作,避免写入中途崩溃导致数据丢失):
cppQSaveFile saveFile("important.txt"); if (saveFile.open(QIODevice::WriteOnly)) { QTextStream out(&saveFile); out << "安全保存的内容"; saveFile.commit(); // 只有commit才会替换原文件 }
总结
- QTextStream:推荐用于文本处理(自动处理编码和换行符)。
- QFile + QByteArray:适合直接操作字节数据或二进制文件。
- 根据需求选择覆盖(
WriteOnly
)或追加(Append
)模式。 - 始终检查文件是否成功打开,并处理异常情况。