一、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();
}