文件读写是大多编程语言所具备的基本功能之一。C语言中有FILE *指针,C++语言中有fstream类。这归根到底是因为操作系统在设计之初就定义了文件系统是其基本要素之一。Qt中也封装了基于C++的跨平台的文件系统类,这些类的功能非常友好,以致于你可能使用了Qt的文件功能类后会对C++的fstream有点陌生了。本篇总结将总结Qt这一非GUI功能——文件系统。
相关的类
类 |
描述 |
QFile |
文件接口类 |
QFileInfo |
文件信息类 |
QDir |
路径类 |
QTemporaryFile |
创建临时文件 |
QTemporaryDir |
创建临时目录 |
QTextStream |
文本流 |
QDataStream |
数据流 |
QFile IO读写文本文件
QFile直接与IO设备打交道,进行文件读写操作。如下代码显示了用QFile直接按行读取文本文件的方法:
QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
while (!file.atEnd()) {
QByteArray line = file.readLine();
process_line(line);
}
其中,QIODevice::ReadOnly表示以只读的方式读取,QIODevice::Text表示以文本的方式读取,这与C++的fstream中的定义类似。类似的IO操作还有:
Constant |
Value |
Description |
QIODevice::NotOpen |
0x0000 |
The device is not open. |
QIODevice::ReadOnly |
0x0001 |
The device is open for reading. |
QIODevice::WriteOnly |
0x0002 |
The device is open for writing. Note that this mode implies Truncate. |
QIODevice::ReadWrite |
ReadOnly | WriteOnly |
The device is open for reading and writing. |
QIODevice::Append |
0x0004 |
The device is opened in append mode so that all data is written to the end of the file. |
QIODevice::Truncate |
0x0008 |
If possible, the device is truncated before it is opened. All earlier contents of the device are lost. |
QIODevice::Text |
0x0010 |
When reading, the end-of-line terminators are translated to '\n'. When writing, the end-of-line terminators are translated to the local encoding, for example '\r\n' for Win32. |
类似的,通过IO直接写文件的话,仅需要将打开方式改为QIODevice::WriteOnly或QIODevice::Append即可。两者的区别是前者暗含了QIODevice::Truncate,即删除文件原有内容,而后者则会在尾部继续填写。
即可:
QFile file("out.txt");
if (!file.open(QIODevice:: WriteOnly | QIODevice::Text))
return;
QByteArray data;
file.write(data, data.length());
file.close();
QFile和QTextStream读写文本文件
QTextStream和QFile结合,为数据读写提供了一些更加方便的类。如下通过QTextStream文本流的方式读取文本文件:
QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
process_line(line);
}
通过文本流写入文件时,其使用方式和fstream中的ofstream类似,即通过“<<”号实现:
QFile file("out.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
out << "The magic number is: " << 49 << "\n";
file.close();
二进制文件读写
Qt中使用QFile和QDataStream进行二进制文件读写。QFile同样负责文件IO,而QDataStream则以数据流的方式读写二进制文件内容。首先来看写入二进制文件:
QFile file("out.dat");
if (!file.open(QIODevice:: WriteOnly))
return;
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_5_9);
stream<<5;
stream<<0xA6;
file.close();
相应的,读取二进制文件的方法是:
QFile file("in.dat");
if (!file.open(QIODevice::ReadOnly))
return;
QDataStream stream(&file);
stream.setVersion(QDataStream::Qt_5_9);
int a,b;
stream >> a;
stream >> b;
file.close();
另外,我们也可以用QDataStream的其他接口函数,如readRawData()和writeRawData()读写原始二进制数据。也可以用readAll接口函数直接读取不论是文本还是二进制文件的所有数据(前提是内存大于文件大小)。QFile基类QFileDevice还提供了map接口来进行文件映射,进而在内存中处理数据。这同样需要考虑内存限制,而且对于现在的告诉固态硬盘来说,文件映射和IO 读取的速度差距越来越小,甚至可以忽略不计了。
文件信息
文件系统操作除了简单的读写外,我们通常要对文件的信息进行管理。在dialog一章中总结了QFileDialog的一些内容,涉及了一部分内容。这里再介绍其他几个相关的类。
QCoreApplication可用于提取应用程序路径、程序名等文件信息;
QFile还可以对文件进行复制、删除等操作;
QFileInfo用于提取文件信息,包括路径、文件名和后缀等;
QDir用于提取目录和文件列表,创建和删除目录以及文件重命名等操作。
QTemporaryFile和QTemporaryDir用以创建临时文件和临时目录;
这涉及到一些列文件系统接口函数,这里挑选常用的进行罗列:
接口 |
所属类 |
功能 |
applicationDirPath() |
QCoreApplication |
返回应用程序启动路径 |
applicationFilePath() |
QCoreApplication |
返回应用程序目录 |
applicationName() |
QCoreApplication |
返回应用程序名称 |
copy() |
QFile |
复制文件 |
remove() |
QFile |
删除文件 |
rename() |
QFile |
重命名文件 |
absoluteDir() |
QFileInfo |
返回绝对路径QDir |
absoluteFilePath() |
QFileInfo |
返回带有文件名的绝对路径 |
absolutePath() |
QFileInfo |
返回绝对路径,不带文件名 |
baseName() |
QFileInfo |
返回文件基名,第一个"."之前的名字 |
completeBaseName() |
QFileInfo |
返回文件基名,最后一个"."之前的名字 |
suffix() |
QFileInfo |
最后一个"."之后的后缀 |
completeSuffix() |
QFileInfo |
第一个"."之后的后缀 |
fileName() |
QFileInfo |
返回去除路径的文件名 |
filePath() |
QFileInfo |
返回包含路径的文件名 |
tempPath() |
QDir |
返回临时文件目录名称 |
rootPath() |
QDir |
返回根目录名称 |
homePath() |
QDir |
返回主目录名称 |
currentPath() |
QDir |
返回当前目录名称 |
absoluteFilePath() |
QDir |
返回当前目录下一个文件的绝对路径文件名 |
absolutePath() |
QDir |
返回当前目录的绝对路径 |
canonicalPath() |
QDir |
返回当前目录的标准路径 |
dirName() |
QDir |
返回最后一级目录名称 |
filePath() |
QDir |
返回下一个文件名录名 |
mkdir() |
QDir |
创建子目录 |
remove() |
QDir |
删除当前目录下的文件 |
rename() |
QDir |
重命名某文件 |
rmdir() |
QDir |
删除指定的目录 |
setFilter() |
QDir |
设置文件过滤器 |
setAutoRemove() |
QTemporaryFile/Dir |
设置是否自动删除 |
path() |
QTemporaryFile/Dir |
返回创建的临时目录名称 |
remove() |
QTemporaryFile/Dir |
删除临时目录及下面所有文件 |
例子
请到本人下载频道下载:https://download.csdn.net/download/bjtuwayne/12075095