一文带你入门QFile

目录:

目录:

概念

主要功能

常用方法

实现基本读写的case

case1 : QFile 读取文件 read():

case 2: 添加写入按钮的槽函数 write()

 case3: QTextStream: 实现读取:

 case4:QTextStream: 实现写入

总代码(包含4个case):

 文件选择对话框 QFileDialog:

引言

使用 QFileDialog 的基本步骤:

case:

case1:  调用 getOpenFileName 得到需要打开的文件路径

case2:优化 stream读取  --> 支持手动选择文件来读取

case3QFileDialog选择多个文件:

case4: QFileDialog 创建并保存文件: 

总代码


概念

QFile 是 Qt 框架中用于文件处理的一个。它提供了读取写入文件的功能,支持文本和二进制文件。

QFile 继承 QIODevice ,因此它可以像其他IO设备一样使用。

主要功能


1. 文件读写: QFile 支持打开文件进行读取或写入操作
2. 文件信息:可以检索有关文件的信息,如大小、修改日期等。
3. 文件操作:提供了对文件进行重命名、移动、删除等操作的能力。
4. 错误处理: QFile 在操作文件时提供了错误处理机制,可以通过相应的函数检查和获取错误信息。

常用方法


open() :打开一个文件。需要指定模式(如只读、只写、读写等)。
close() :关闭文件。
read() 和 write() :用于读取和写入数据。
exists() :检查文件是否存在
remove() :删除文件。
copy() :复制文件

=============================================

Tips


QT  添加头文件的快捷键  -->  选中我们需要函数/类,alt +enter

实现基本读写的case

case1 : QFile 读取文件 read():

先创建文本文件:

#include "widget.h"
#include "ui_widget.h"

#include <QFile>
#include <QDebug>

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

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


void Widget::on_btnRead_clicked()
{

    // 打开文件
     //  func1 -- 构造函数直接指定 文件
     //QFile   qfile("F:/myqt/project_of_qt_new/test.txt");
     //  func2 -- 无参构造在调用setFileName 去指定文件
     QFile qfile;
     qfile.setFileName("F:/myqt/project_of_qt_new/test.txt");
     if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
      {
         qDebug()<<"Open Error";
     }
    //读取文件
     char context[100] = {'\0'};
     if(-1 == qfile.read(context,100)) return;
      // 展示文件
     qDebug()<<context;
     // 关闭文件
     qfile.close();

}

现象输出

========================================

case 2: 添加写入按钮的槽函数 write()

void Widget::on_btnWrite_clicked()
{
   //  打开
    //  实例化 QFile 对象,指定要打开的文件
      QFile   qfile("F:/myqt/project_of_qt_new/test2.txt");
      if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
       {
          qDebug()<<"Open Error";
      }
    // 写入
    qfile.write("this is data2 for write to qtFile 写个 中文看看");
    //关闭
    qfile.close();

}

 QTextStream的特性:


 case3: QTextStream: 实现读取:

void Widget::on_strRead_clicked()
{
    //  先打开文件
    QFile   qfile("F:/myqt/project_of_qt_new/test.txt");

    if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
     {
        qDebug()<<"Open Error";
    }

    QTextStream in(&qfile);
    in.setCodec("UTF-8"); //设置编码格式
// 读取单行
//    QString context =in.read(qfile.size());
//    qDebug() << context;
    // 读取多行
    while (!in.atEnd()) {// 当没到文件尾部
    QString context =in.readLine(qfile.size());// 每次读一行
    qDebug() << context;
    qDebug() << "----------------";
    }


    qfile.close();
}

 case4:QTextStream: 实现写入

void Widget::on_strWrite_clicked()
{

    QFile   qfile("F:/myqt/project_of_qt_new/test3.txt");

    if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
     {
        qDebug()<<"Open Error";
    }

    QTextStream out(&qfile); // & --拷贝构造函数  -- 指向内存空间的地址
    out.setCodec("UTF-8");
    // out往文件里面写
    out << "I write stram char to File";
    qfile.close();

}

总代码(包含4个case):

#include "widget.h"
#include "ui_widget.h"

#include <QFile>
#include <QDebug>

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

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


void Widget::on_btnRead_clicked()
{

    // 打开文件
     //  func1 -- 构造函数直接指定 文件
     QFile   qfile("F:/myqt/project_of_qt_new/test.txt");
     //  func2 -- 无参构造在调用setFileName 去指定文件
//     QFile qfile;
//     qfile.setFileName("F:/myqt/project_of_qt_new/test.txt");

     if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
      {
         qDebug()<<"Open Error";
     }
    //读取文件
     int size = qfile.size(); // size() API --> 查看当前文件大小
    // char context[size] = {'\0'};
      char *context = new char(size);
     //if(-1 == qfile.read(context,size)) return;
     qfile.read(context,size);
      // 展示文件
     qDebug()<<context;
     // 关闭文件
      qfile.close();

}

void Widget::on_btnWrite_clicked()
{
   //  打开
    //  实例化 QFile 对象,指定要打开的文件
      QFile   qfile("F:/myqt/project_of_qt_new/test2.txt");
      if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
       {
          qDebug()<<"Open Error";
      }
    // 写入
    qfile.write("this is data2 for write to qtFile 测试中文");
    //关闭
    qfile.close();

}

void Widget::on_strRead_clicked()
{
    //  先打开文件
    QFile   qfile("F:/myqt/project_of_qt_new/test.txt");

    if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
     {
        qDebug()<<"Open Error";
    }

    QTextStream in(&qfile);
    in.setCodec("UTF-8"); //设置编码格式
// 读取单行
//    QString context =in.read(qfile.size());
//    qDebug() << context;
    // 读取多行
    while (!in.atEnd()) {// 当没到文件尾部
    QString context =in.readLine(qfile.size());// 每次读一行
    qDebug() << context;
    qDebug() << "----------------";
    }


    qfile.close();
}

void Widget::on_strWrite_clicked()
{

    QFile   qfile("F:/myqt/project_of_qt_new/test3.txt");

    if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
     {
        qDebug()<<"Open Error";
    }

    QTextStream out(&qfile); // & --拷贝构造函数  -- 指向内存空间的地址
    out.setCodec("UTF-8");
    // out往文件里面写
    out << "I write stram char to File";
    qfile.close();

}

 文件选择对话框 QFileDialog:

引言

为什么 需要引入 --> 前面我们对文件的操作都是使用代码来写死了,我们希望我们的路径灵活选择,QFileDialog 为我们提供了相关的功能


使用 QFileDialog 的基本步骤:


实例化:首先,创建一个 QFileDialog 对象的实例

QFileDialog dialog;

设置模式:根据需要设置对话框的模式,如打开文件、保存文件等。

dialog.setFileMode(QFileDialog::AnyFile);


设置过滤器:如果需要,可以设置文件类型过滤器,以限制用户可以选择的文件类型


dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML
files (*.xml)"));


显示对话框:通过调用 exec() 方法显示对话框,并在用户作出选择后执行相应的操作。

if (dialog.exec()) {
QStringList files = dialog.selectedFiles();
// 对用户选定的文件进行操作
}

通过 selectedFiles 方法获取用户选择的文件路径列表,然后对这些文件进行相应的处理。
这是使用 QFileDialog 的基本模式。

Qt 也允许使用静态方法直接创建和显示对话框,例如
QFileDialog::getOpenFileName() ,这些方法更简单,但提供的自定义选项较少。

 

case:


case1:  调用 getOpenFileName 得到需要打开的文件路径

#include "widget.h"
#include "ui_widget.h"

#include <QFileDialog>
#include <QDebug>

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

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


void Widget::on_btnQFileDialog_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), // this --> 指定当前的Widget对象 ,作用打开文件
                            "F:/myqt/project_of_qt_new", // 默认打开的路径
                           tr("Text (*txt)"));//限制能打开文件的格式
    qDebug() <<fileName;
}

case2:优化 stream读取  --> 支持手动选择文件来读取

void Widget::on_strRead_clicked()
{
    //  先打开文件
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), // this --> 指定当前的Widget对象 ,作用打开文件
                            "F:/myqt/project_of_qt_new", // 默认打开的路径
                           tr("Text (*txt)"));//限制能打开文件的格式

     QFile   qfile(fileName);

    if(!qfile.open(QIODevice::ReadOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
     {
        qDebug()<<"Open Error";
    }

    QTextStream in(&qfile);
    in.setCodec("UTF-8"); //设置编码格式
// 读取单行
//    QString context =in.read(qfile.size());
//    qDebug() << context;
    // 读取多行
    while (!in.atEnd()) {// 当没到文件尾部
    QString context =in.readLine(qfile.size());// 每次读一行
    qDebug() << context;
    qDebug() << "----------------";
    }


    qfile.close();
}



case3QFileDialog选择多个文件:

void Widget::on_btnSE_clicked()
{
    QFileDialog dialog; //创建 QFileDialog 对象
    dialog.setFileMode(QFileDialog::ExistingFiles); //指定模式 -- 能打开已经存在的文件  Files --> 支持同时选择多个文件
    dialog.setNameFilter("*.txt"); // 过滤器,只显示 txt文件
    dialog.exec(); //开始运行这个对象
    QStringList qstrings = dialog.selectedFiles(); // 获取选择到的(多个)文件
    for(QString str : qstrings) // 迭代的方式遍历列表
    {
        qDebug()<<str;
    }
}

输出现象


case4: QFileDialog 创建并保存文件: 

getSaveFileName API的调用

void Widget::on_btnSave_clicked()
{

    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),//设置为保存文件模式
          "F:/myqt/project_of_qt_new/default.txt", // 默认打开的路径,加上/default.txt,指定默认文件名
           tr("Text (*.txt *.doc)"));//限制能打开文件的格式 ,这里指定保存文件类型了,不写后缀 .txt 只写文件名也可以

   qDebug()<< fileName;

    QFile   qfile(fileName);
    if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
     {
        qDebug()<<"Open Error";
    }

    QTextStream out(&qfile); // & --拷贝构造函数  -- 指向内存空间的地址
    out.setCodec("UTF-8");
    // out往文件里面写
    out << "Test of save  file.";
    qfile.close();
}

总代码

#include "widget.h"
#include "ui_widget.h"

#include <QFileDialog>
#include <QDebug>

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

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


void Widget::on_btnQFileDialog_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), // this --> 指定当前的Widget对象 ,作用打开文件
                            "F:/myqt/project_of_qt_new", // 默认打开的路径
                           tr("Text (*txt)"));//限制能打开文件的格式
    qDebug() <<fileName;
}

void Widget::on_btnSE_clicked()
{
    QFileDialog dialog; //创建 QFileDialog 对象
    dialog.setFileMode(QFileDialog::ExistingFiles); //指定模式 -- 能打开已经存在的文件  Files --> 支持同时选择多个文件
    dialog.setNameFilter("*.txt"); // 过滤器,只显示 txt文件
    dialog.exec(); //开始运行这个对象
    QStringList qstrings = dialog.selectedFiles(); // 获取选择到的(多个)文件
    for(QString str : qstrings) // 迭代的方式遍历列表
    {
        qDebug()<<str;
    }
}

void Widget::on_btnSave_clicked()
{

    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),//设置为保存文件模式
          "F:/myqt/project_of_qt_new/default.txt", // 默认打开的路径,加上/default.txt,指定默认文件名
           tr("Text (*.txt *.doc)"));//限制能打开文件的格式 ,这里指定保存文件类型了,不写后缀 .txt 只写文件名也可以

   qDebug()<< fileName;

    QFile   qfile(fileName);
    if(!qfile.open(QIODevice::WriteOnly | QIODevice::Text)) // Text --> 对\n 做检查,win系统下会转化为\r\n,对换行读取更好
     {
        qDebug()<<"Open Error";
    }

    QTextStream out(&qfile); // & --拷贝构造函数  -- 指向内存空间的地址
    out.setCodec("UTF-8");
    // out往文件里面写
    out << "Test of save  file.";
    qfile.close();
}


 

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值