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

摘要

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

  1. 处理文本文件和二进制文件,可以使用QTextStream类和QDataStream类;
  2. 处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo;
  3. 处理目录可以使用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类读取了二进制文件,并将其输出到控制台。

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

猜你喜欢

转载自blog.csdn.net/weixin_43335226/article/details/107035636
Qt5