C++ Qt文件操作
2020 年 05 月 19 日 1975 955 字 暂无评论

1.QFile读文件

其实方法很简单,和原来C/C++读写文件差不多

  • 需要包含头文件
#include <QFile>      //文件
#include <QFileDialog>//文件对话框 这里是为了显示ui界面 
  • 用代码说话
  QString path = QFileDialog::getOpenFileName(this,"open","../");//获取文件路径名
    if(path.isEmpty() == false)
    {
        //文件对象
        QFile file(path);

        //打开文件,只读方式
        bool isOk = file.open(QIODevice::ReadOnly);
        if(isOk == true)
        {
#if 0
            //读文件,默认UTF8
            QByteArray array = file.readAll();
            //显示到编辑区
            ui->textEdit->setText(QString(array));
#endif
            QByteArray array;
            while(file.atEnd() == false)
            {
                //读一行
                array += file.readLine();
            }
            ui->textEdit->setText(QString(array));
        }

        //关闭文件
        file.close();
  • 这里读文件有两种方式

    • 第一种是一次性读也就是readAll()适合文件小的时候读
    • 第二章是一行一行读,这种比较常用

2.QFile写文件

同读一样,也需要以上两个头文件

QString path = QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
    if(path.isEmpty() == false)
    {
        //创建文件对象
        QFile file;
        //关联文件名字
        file.setFileName(path);
        //打开文件,只方式
        bool isOk = file.open(QIODevice::WriteOnly);
        if(isOk == true)
        {
            //获取编辑区内容
            QString str = ui->textEdit->toPlainText();
            //写文件
            //QString -> QByteArray
            file.write(str.toUtf8());
        }
        //关闭文件
        file.close();
  • 这里指定写为.txt格式,当然可以自己指定其他格式

3.QFileInfo获取文件信息

//获取文件信息
        QFileInfo info(path);
        qDebug() << "文件名字:" << info.fileName();
        qDebug() << "文件后缀:" << info.suffix();
        qDebug() << "文件大小:" << info.size();
        qDebug() << "文件创建时间:" << info.created().toString("yyyy-MM-dd hh:mm:ss");
  • 很简单,这里使用几种做测试,其他可以自己体验

4.文件小程序

  • 先上代码
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_buttonRead_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open","../");
    if(path.isEmpty() == false)
    {
        //文件对象
        QFile file(path);

        //打开文件,只读方式
        bool isOk = file.open(QIODevice::ReadOnly);
        if(isOk == true)
        {
#if 0
            //读文件,默认UTF8
            QByteArray array = file.readAll();
            //显示到编辑区
            ui->textEdit->setText(QString(array));
#endif
            QByteArray array;
            while(file.atEnd() == false)
            {
                //读一行
                array += file.readLine();
            }
            ui->textEdit->setText(QString(array));
        }

        //关闭文件
        file.close();

        //获取文件信息
        QFileInfo info(path);
        qDebug() << "文件名字:" << info.fileName();
        qDebug() << "文件后缀:" << info.suffix();
        qDebug() << "文件大小:" << info.size();
        qDebug() << "文件创建时间:" << info.created().toString("yyyy-MM-dd hh:mm:ss");
    }
}

void Widget::on_ButtonWrite_clicked()
{
    QString path = QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
    if(path.isEmpty() == false)
    {
        //创建文件对象
        QFile file;
        //关联文件名字
        file.setFileName(path);
        //打开文件,只方式
        bool isOk = file.open(QIODevice::WriteOnly);
        if(isOk == true)
        {
            //获取编辑区内容
            QString str = ui->textEdit->toPlainText();
            //写文件
            //QString -> QByteArray
            file.write(str.toUtf8());
        }
        //关闭文件
        file.close();

        //获取文件信息
        QFileInfo info(path);
        qDebug() << "文件名字:" << info.fileName();
        qDebug() << "文件后缀:" << info.suffix();
        qDebug() << "文件大小:" << info.size();
        qDebug() << "文件创建时间:" << info.created().toString("yyyy-MM-dd hh:mm:ss");
    }
}

运行结果

  • 通过两个按键,一个可以选择文件,将文件内容读到文本框内,一个可以将文本框内内容写到文件保存到指定路径和文件名字,在关闭文件后都将在控制台显示文件基本信息。
  • 点击读打开文件对话框

  • 选择文件后在文本框中显示,并且控制台输出文件基础信息

5.QDataStream读写文件

  • QDataStream是一种数据流形式,用法也很方便
#include "widget.h"
#include "ui_widget.h"
#include <QDataStream> //要使用数据流读写包含头文件
#include <QFile>       //文件
#include <QDebug>

#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    writeData();
    readData();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::writeData()
{
    //创建文件对象
    QFile file("../test.txt");

    //打开文件,只写方式打开
    bool isOk = file.open(QIODevice::WriteOnly);
    if(true == isOk)
    {
        //创建数据流,和file文件关联
        //往数据流中输入数据,相当于往文件里写数据
        QDataStream stream(&file);

        stream << QString("你好啊!!!") << 250;
    }
    file.close();
}

void Widget::readData()
{
    //创建文件对象
    QFile file("../test.txt");

    //打开文件,只读方式打开
    bool isOk = file.open(QIODevice::ReadOnly);
    if(true == isOk)
    {
        //创建数据流,和file文件关联
        //往数据流中输入数据,相当于往文件里写数据
        QDataStream stream(&file);

        //读的时候,按写的顺序取数据
        QString str;
        int a;
        stream >> str >> a;
        //qDebug() << str.toUtf8().data() << a;
        cout << str.toUtf8().data() << a;
    }
    file.close();
}
  • 创建数据流,和file文件关联
  • 往数据流中输入数据,相当于往文件里写数据

    • 输入用<<
    • 输出用>>
  • 这里提一个实用的用法,在c语言就有内置方法,通过宏定义使qDebug()更实用
#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"

输出结果

  • 这样方便检查出是什么文件,在第几行的qDebug()输出,方法查错

6.QTextStream读写文件

  • 其实用法都差不多,只是文本数据流可以设置编码形式
  • 不多bb,理论再多不如实际操作学的快,上代码
#include "widget.h"
#include "ui_widget.h"
#include <QTextStream>  //记得用包含头文件
#include <QFile>
#include <QDebug>
#include <QFileDialog> 

#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    writeData();
    readData();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::writeData()
{
    QFile file;
    file.setFileName("../demo.txt");

    bool isOk = file.open(QIODevice::WriteOnly);
    if(true == isOk)
    {
        QTextStream stream(&file);

        //指定编码
        stream.setCodec("UTF-8");

        stream << QString("你好啊!") << 250;

    }
    file.close();
}

void Widget::readData()
{
    QFile file;
    file.setFileName("../demo.txt");

    bool isOk = file.open(QIODevice::ReadOnly);
    if(true == isOk)
    {
        QTextStream stream(&file);

        //指定编码
        stream.setCodec("UTF-8");
        QString str;
        int a;
        stream >> str >> a;
        cout << str << a;
    }
    file.close();
}

void Widget::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open","../");
    if(false == path.isEmpty())
    {
        QFile file;
        file.setFileName(path);

        bool isOk = file.open(QIODevice::ReadOnly);
        if(true == isOk)
        {
            QTextStream stream(&file);

            //指定编码
            stream.setCodec("UTF-8");
            QByteArray array;
            while(file.atEnd() == false)
            {
                //读一行
                array += file.readLine();
            }
            ui->textEdit->setText(QString(array));
        }
    }
}
  • 这里不推荐以数据流格式读文件,但我还是写了,方便和另一种做区分

运行结果

  • 可以看到,他无法确定结束,把 你好啊!250 当成一个字符串传给了str,而a只接收了0

7.QBuffer

  • QBuffer是一种缓冲区,把内容写到缓存中,然后进行操作
#include "widget.h"
#include "ui_widget.h"
#include <QBuffer> //内存文件
#include <QDebug>  

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QByteArray array;
    QBuffer memFile(&array); //创建内存文件
    memFile.open(QIODevice::WriteOnly);

    memFile.write("nihao");
    memFile.write("buhao");  //输出会自动拼接成一个字符串

    memFile.close();        //记得关闭缓存

    qDebug() << memFile.buffer();  
    qDebug() << array;          //相当于字缓存内容写到字符数组,所以两次输出是一样的

    QBuffer memFile1;
    memFile1.open(QIODevice::WriteOnly);
    QDataStream stream(&memFile1);
    stream <<QString("你好")<<520;
    memFile1.close();

    memFile1.open(QIODevice::ReadOnly);  //通过读方式
    QDataStream stream1;
    stream.setDevice(&memFile1);
    QString str;
    int a;
    stream >> str >> a;
    memFile1.close();

    qDebug() << str.toUtf8().data() << a; //文字通过utf8编码显示
}

Widget::~Widget()
{
    delete ui;
}
  • 可以看到用法也很简单,其他操作和前面差不多

运行结果


版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/78/



评论已关闭