Qt提供了QFile类用于进行文件操作。
QFile 类提供了读写文件的接口,可以读写文本文件、二进制文件和Qt的资源文件。
读写文本文件的方法通常有两种:一种是直接利用传统的QFile类方法;另一种是利用更为方便的QTextStream类方法。
案例分析:
建立基于控制台工程,使用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
#include
解析:
●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<
(4)选择“构建”→“构建项目" TextFile "”菜单项,首先编辑本例所用的文本文件“textFile.txt”,保存在项目的build-TextFile-
Desktop_Qt_5_13_2_MSVC2017_64bit-Debug目录下,然后运行程序,运行结果如下图所示。
其中,显示的字符串“Hello Word!“是文本文件“textFile.txt” 中的内容。
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< QTextStream 的格式化函数 其中,left操作符是QTextStream定义的类似于中的流操作符。 QTextStream还提供了其他一-些流操作符,见下表。 QTextStream 的流操作符 (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”,勾选“创建界面”复选框的选中状态。 如下图所示。 (3)、源文件"mainwindow.cpp”的具体代码如下: a、mainwindow构造函数如下: b、fileFun()函数功能如下: 解析 : 文件。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)、运行结果如下图所示:
函数
功能描述
qSetFieldWidth(int width)
设置字段宽度
qSetPadChar(QChar ch)
设置填充字符
qSetRealNumberPercision(int precision)
设置实数精度
操作符
作用描述
bin
设置读写的整数为二进制数
oct
设置读写的整数为八进制数
dec
设置读写的整数为十进制数
hex
设置读写的整数为十六进制数
show base
强制显示进制前缀
forcesign
强制显示符号(+,-)
forcepoint
强制显示小数点
noshow base
不显示进制前缀
noforcesign
不显示符号
uppercasebase
显示大写的进制前缀
lowercasebase
显示小写的进制前缀
uppercasedigits
用大写字母表示
lowercasedigits
用小写字母表示
fixed
固定小数点表示
scientific
科学计数法表示
left
左对齐
right
右对齐
center
居中
endl
换行
flush
清除缓冲
二、读写二进制文件
具体步骤如下:
(2)在头文件“mainwindow.h” 中添加公有成员函数:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void fileFun();
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
fileFun(); //直接执行fileFun()
}
MainWindow::~MainWindow()
{
}
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()之间的代码段:将二进制数据写到数据流。每一个条目都以定义的二进制格式写入
此时,通过QFile类读取了二进制文件,并将其输出到控制台。至此,QT读写常见类型文件的功能就大概学完了!