QT5开发||13、QT5读写文件
摘要
Qt提供了QFile类用于进行文件操作。
QFile 类提供了读写文件的接口,可以读写文本文件、二进制文件和Qt的资源文件。
- 处理文本文件和二进制文件,可以使用QTextStream类和QDataStream类;
- 处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo;
- 处理目录可以使用QDir,监视文件和目录变化可以使用QFileSystemWatcher。
一、读写文本文件
读写文本文件的方法通常有两种:一种是直接利用传统的QFile类方法;另一种是利用更为方便的QTextStream类方法。
1、QFile类读写文本
案例分析:
建立基于控制台工程,使用QFile类读写文本文件。具体实现步骤如下。
(1)建立一个工程。选择“文件”→“新建文件或项…”菜单项,在弹出的对话框中选择“项目”组下的“Application”→“Qt
Console Application"菜单项,单击“Choose”按钮。
(2)在弹出的对话框中对该工程进行命名并选择保存工程的路径,这里将工程命名为"TextFile", 单击“下一步”按钮,再
次单击“下一一步”按钮,最后单击“完成”按钮,完成该文件工程的建立。
(3)源文件“main.cpp" 的具体实现代码如下:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("textFile.txt");
if(file.open(QIODevice::ReadOnly))
{
char buffer[2048];
qint64 lineLen = file.readLine(buffer,sizeof(buffer));
if(lineLen!=-1)
{
qDebug()<<buffer;
}
}
return a.exec();
}
(4)、添加头文件:
#include <QFile>
#include <QtDebug>
解析:
●QFile file(“textFile.txt”):打开-一个文件有两种方式:
一种方式是在构造函数中指定文件名;另一种方式是使setFileName()函数设置文件名。
●if(file.open(QIODevice::ReadOnly)):打开文件使用open()函数,关闭文件使用close()函数。
此处的open()函数以只读方式打开文件。只读方式参数为QIODevice:ReadOnly,只写方式参数为QIODevice::WriteOnly, 读写参数为QIODevice::ReadWrite。
●qint64 lineLen = file.readLine(buffer,sizeof(buffer)): 在QFile中可以使用从.QIODevice中继承的readLine()函数读取文本文件的一行。
●if(lineLen!=-1){ qDebug0<<buffer;}:如果读取成功,则readLine()函数返回实际读取的字节数;如果读取失败则返回“-1”。
(4)选择“构建”→“构建项目" TextFile "”菜单项,首先编辑本例所用的文本文件“textFile.txt”,保存在项目的build-TextFile-
Desktop_Qt_5_13_2_MSVC2017_64bit-Debug目录下,然后运行程序,运行结果如下图所示。
其中,显示的字符串“Hello Word!“是文本文件“textFile.txt” 中的内容。
2、QTextStream类读写文本
QTextStream提供了更为方便的接口来读写文本,它可以操作QIODevice、QByteArray和QString。使用QTextStream的
流操作符,可以方便地读写单词、行和数字。为了产生文本,QtextStream 还提供了填充、对齐和数字格式化的选项。
实例分析:
建立基于控制台工程,使用QTextStream类读写文本文件。
具体步骤见上面使用QFile类读写文本。
(1)源文件“main.cpp” 的具体实现代码如下:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile data("TextFile.txt");
if(data.open(QFile::WriteOnly|QFile::Truncate))
{
QTextStream out(&data);
out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<<endl;
}
return a.exec();
}
解析:
●if(data.open(QFile::WriteOnly|QFile::Truncate)):参数QFile::Truncate表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。
●out<<QObjet:tr(“score:”)<<qSetFieldWidth(10)<<left<<90<<endl :用户使用格式化函数和流操作符设置需要的输出格式。其中,qSetFieldWidth()函 数是设置字段宽度的格式化函数。除此之外,QTextStream 还提供了其他一- 些格式化函数,见下表。
QTextStream 的格式化函数
函数 | 功能描述 |
---|---|
qSetFieldWidth(int width) | 设置字段宽度 |
qSetPadChar(QChar ch) | 设置填充字符 |
qSetRealNumberPercision(int precision) | 设置实数精度 |
其中,left操作符是QTextStream定义的类似于中的流操作符。
QTextStream还提供了其他一-些流操作符,见下表。
QTextStream 的流操作符
操作符 | 作用描述 |
---|---|
bin | 设置读写的整数为二进制数 |
oct | 设置读写的整数为八进制数 |
dec | 设置读写的整数为十进制数 |
hex | 设置读写的整数为十六进制数 |
show base | 强制显示进制前缀 |
forcesign | 强制显示符号(+,-) |
forcepoint | 强制显示小数点 |
noshow base | 不显示进制前缀 |
noforcesign | 不显示符号 |
uppercasebase | 显示大写的进制前缀 |
lowercasebase | 显示小写的进制前缀 |
uppercasedigits | 用大写字母表示 |
lowercasedigits | 用小写字母表示 |
fixed | 固定小数点表示 |
scientific | 科学计数法表示 |
left | 左对齐 |
right | 右对齐 |
center | 居中 |
endl | 换行 |
flush | 清除缓冲 |
(3)、运行程序,可以看到在项目的build-TextFile2-Desktop_Qt_5_13_2_MSVC2017_64bit-Debug目录下自动建立了一
个文本文件"TextFile.txt",打开后的内容如下图。
二、读写二进制文件
QDataStream类提供了将二进制文件串行化的功能,用于实现C++基本数据类型,如char、short、int、char*等的串行
化。更复杂的串行化操作则是通过将数据类型分解为基本类型来完成的。
案例分析:使用QDataStream读写二进制文件。
具体步骤如下:
(1) 新建Qt Gui应用 ,选择Qt Widgets Application,项目名称为“binaryFile”, 基类选择“ QMainWindow”,类名命
名为“MainWindow”,勾选“创建界面”复选框的选中状态。 如下图所示。
(2)在头文件“mainwindow.h” 中添加公有成员函数:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void fileFun();
};
(3)、源文件"mainwindow.cpp”的具体代码如下:
a、mainwindow构造函数如下:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
fileFun(); //直接执行fileFun()
}
MainWindow::~MainWindow()
{
}
b、fileFun()函数功能如下:
void MainWindow::fileFun()
{
QFile file("binary.dat");
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
QDataStream out(&file); //将数据序列化
out << QString(tr("王程锦:")); //字符串序列化
out << QDate::fromString("2020/06/30", "yyyy/MM/dd");
out << (qint32)20; //整数序列化
file.close();
file.setFileName("binary.dat");
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<< "error!";
return;
}
QDataStream in(&file); //从文件中读出数据
QString name;
QDate birthday;
qint32 age;
in >> name >> birthday >> age; //获取字符串和整数
qDebug() << name << birthday << age;
file.close();
}
解析 :
●QFile file(“binary.dat”)到file.close()之间的代码段:将二进制数据写到数据流。每一个条目都以定义的二进制格式写入
文件。Qt 中的很多类型,包括QBrush、QColor、QDateTime、 QFont、 QPixmap、 QString、 QVariant 等都可以写
入数据流。QDataStream类写入了name(QString)、birthday(QDate)和 age(qint32)这三个数据。
注意,在读取时也要使用相同的类型读出。
●file.setFileName(“binary.dat”)到file.close(之间的代码段:从文件中读取数据.QDataStream类可以读取任意的以
QIODevice为基类的类生成对象产生的数据,如QTepSocket、 QUdpSocket、 QBuffer、 QFile、 QProcess 等类的数
据。可以使用QDataStream在QAbstractSocket–端写数据,另外–端使用QDataStream读取数据。
●如果需要读取原始数据,则可以使用readRawdata()读取数据并保存到预先定义好的char*缓冲区,写原始数据使用
writeRawData()。读写原始数据需要对数据进行编码和解码。
(4)、运行结果如下图所示:
此时,通过QFile类读取了二进制文件,并将其输出到控制台。