Qt有哪些读取文件的方式
1. 使用 QFile 和 QTextStream(文本文件读取)
适用于纯文本文件,按行或整体读取。
示例代码:逐行读取
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();
}
示例代码:读取整个文件
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
QString content = in.readAll(); // 读取所有内容
qDebug() << content;
file.close();
}
特点
- 适用场景:纯文本文件(.txt 等)。
- QTextStream:提供了便捷的文本读取和写入功能。
2. 使用 QFile 和 QDataStream(二进制文件读取)
适用于二进制文件(如图片、数据流等),逐字节读取。
示例代码:读取二进制文件
QFile file("example.bin");
if (file.open(QIODevice::ReadOnly)) {
QDataStream in(&file);
qint32 value;
in >> value; // 从文件读取数据
qDebug() << "读取的值:" << value;
file.close();
}
特点
- 适用场景:二进制文件,或者自定义数据结构存储文件。
- QDataStream:高效处理字节流,适合二进制数据的读写。
3. 使用 QFile 和 QByteArray(字节读取)
直接读取文件内容到 QByteArray,然后按需处理数据。
示例代码:读取文件所有字节
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly)) {
QByteArray data = file.readAll(); // 读取所有字节
qDebug() << "文件内容:" << data;
file.close();
}
示例代码:逐行读取(按字节分割)
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly)) {
while (!file.atEnd()) {
QByteArray line = file.readLine(); // 按行读取字节
qDebug() << "一行内容:" << line.trimmed();
}
file.close();
}
特点
- 适用场景:文本文件、二进制文件均可。
- QByteArray:提供灵活的字节数据操作。
4. 使用 QFileSystemModel(结合 UI 显示文件)
用于读取文件目录和内容,常与 QTreeView、QListView 等 UI 控件结合。
示例代码:显示目录文件列表
QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::currentPath());
QTreeView *tree = new QTreeView;
tree->setModel(model);
tree->setRootIndex(model->index(QDir::currentPath()));
tree->show();
特点
- 适用场景:图形界面显示文件系统结构。
- 提供文件目录的树状、列表视图。
5. 使用 QIODevice::read() 和 QIODevice::readLine()
适用于自定义文件读取操作,提供灵活的字节级别读取。
示例代码:自定义读取文件
QFile file("example.txt");
if (file.open(QIODevice::ReadOnly)) {
while (!file.atEnd()) {
QByteArray line = file.read(100); // 读取100字节
qDebug() << line;
}
file.close();
}
特点
- 提供灵活的读取长度和数据控制。
- 可用于自定义文件格式解析。
6. 使用 QXmlStreamReader(XML 文件读取)
适用于XML 格式文件。
示例代码:读取 XML 文件
QFile file("example.xml");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
QXmlStreamReader xml(&file);
while (!xml.atEnd() && !xml.hasError()) {
xml.readNext();
if (xml.isStartElement() && xml.name() == "element") {
qDebug() << "Element 内容:" << xml.readElementText();
}
}
file.close();
特点
- 适用场景:解析结构化 XML 数据。
- QXmlStreamReader:高效的事件驱动式 XML 解析。
7. 使用 QJsonDocument(JSON 文件读取)
适用于JSON 格式文件。
示例代码:读取 JSON 文件
QFile file("example.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
QByteArray data = file.readAll();
QJsonDocument doc = QJsonDocument::fromJson(data);
QJsonObject obj = doc.object();
qDebug() << "Key 内容:" << obj["key"].toString();
file.close();
特点
- 适用场景:解析 JSON 格式数据。
- 提供高效的 JSON 文件读写操作。
总结
方式 | 适用场景 | 核心类 |
---|---|---|
QTextStream | 文本文件读取/写入 | QFile, QTextStream |
QDataStream | 二进制文件读取/写入 | QFile, QDataStream |
QByteArray + QFile | 字节级文件读取 | QFile, QByteArray |
QFileSystemModel | UI 显示文件系统结构 | QFileSystemModel |
QXmlStreamReader | XML 文件解析 | QFile, QXmlStreamReader |
QJsonDocument | JSON 文件解析 | QFile, QJsonDocument |
根据文件类型和需求,可以选择适合的方式进行文件读取。