欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT5开发||13、QT5读写文件

程序员文章站 2022-05-28 11:55:59
...

摘要

Qt提供了QFile类用于进行文件操作。
QFile 类提供了读写文件的接口,可以读写文本文件、二进制文件和Qt的资源文件。

  1. 处理文本文件和二进制文件,可以使用QTextStream类和QDataStream类;
  2. 处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo;
  3. 处理目录可以使用QDir,监视文件和目录变化可以使用QFileSystemWatcher。

一、读写文本文件

读写文本文件的方法通常有两种:一种是直接利用传统的QFile类方法;另一种是利用更为方便的QTextStream类方法。

1、QFile类读写文本

案例分析:
建立基于控制台工程,使用QFile类读写文本文件。具体实现步骤如下。

(1)建立一个工程。选择“文件”→“新建文件或项…”菜单项,在弹出的对话框中选择“项目”组下的“Application”→“Qt

Console Application"菜单项,单击“Choose”按钮。
QT5开发||13、QT5读写文件(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目录下,然后运行程序,运行结果如下图所示。
QT5开发||13、QT5读写文件其中,显示的字符串“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",打开后的内容如下图。
QT5开发||13、QT5读写文件

二、读写二进制文件

QDataStream类提供了将二进制文件串行化的功能,用于实现C++基本数据类型,如char、short、int、char*等的串行

化。更复杂的串行化操作则是通过将数据类型分解为基本类型来完成的。

案例分析:使用QDataStream读写二进制文件。
具体步骤如下:

(1) 新建Qt Gui应用 ,选择Qt Widgets Application,项目名称为“binaryFile”, 基类选择“ QMainWindow”,类名命

名为“MainWindow”,勾选“创建界面”复选框的选中状态。 如下图所示。
QT5开发||13、QT5读写文件(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)、运行结果如下图所示:
QT5开发||13、QT5读写文件
QT5开发||13、QT5读写文件
此时,通过QFile类读取了二进制文件,并将其输出到控制台。

至此,QT读写常见类型文件的功能就大概学完了!

相关标签: GUI qt c++