Day03 (下)_Qt文件系统

一、基本文件操作

1、文件的读取

Qfile提供了从文件中读取和写入数据的能力。一般是将文件路径作为参数传递给Qfile的构造函数,也可以在创建好对象后,使用setFileName()进行修改。Qfile提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。可以使用QdataStream或者QtextStream类来读写文件,也可以使用QIODevice类土工的read()、readLine()、readAll()以及write()这样的函数进行读写操作。

有关文件的信息是通过QfileInfo进行读取,比如文件名、文件所在目录等,而不是分析文件路径字符串。

在ui界面设计读取文件按钮,按键的槽函数功能是弹出文件对话框界面,传入的参数为父组件、窗口主题、文件地址、打开文件类型。使用的函数为QFileDialog::getOpenFileName(),其返回值的类型为Qstring类型,为文件地址。

接下来在判断文件地址是否为空,不是空的话就创建一个Qfile结构体,在这个类型中传入上一个函数得到的文件地址参数(QFile file(path);)。然后将文件对象打开,使用的函数为:bool isOk = file.open(QIODevice::ReadOnly);,可以在open函数中设置文件打开的属性,然后在文本框中进行显示,显示之后关闭file停止线程占用,使用的函数为:file.close();。

为了获取文件的信息,使用Qfileinfo函数,新建一个QfileInfo类,然后显示文件属性:

读取代码为:

void Widget::on_buttonRead_clicked()

{

    //获取文件路径

    /*this,    父组件

     * "open", 界面主提

     * "../",  文件目录,此处表示任意

     * "TXT(*.txt)" 打开文件的类型

    */

    QString path=QFileDialog::getOpenFileName(this,

                                    "open","../","TXT(*.txt)");

    if(path.isEmpty()==false)

    {

        //文件对象

        QFile file(path);

        //打开文件,readonly

      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(array);

      }

      //关闭文件

      file.close();

      //获取文件信息

      QFileInfo info(path);

      qDebug()<<"file name: "<<info.fileName().toUtf8().data();//中文显示

      qDebug()<<"file houzhui: "<<info.suffix();

      qDebug()<<"file size(): "<<info.size();      //以字节为单位

       qDebug()<<"file time(): "<<info.created().toString("yyyy-MM-dd hh:mm:ss");  //2020-01-27-22:02

    }

}

2、文件的写入

文件的写入与文件读取类似,都是先通过对话框函数获取文件存储的路径,获取到文件存储路径后,将路径传入到文件对象中,也可以使用setfilename()函数实现路径参数传入,比如:

QFile file;  //创建文件对象

file.setFileName(path);  //关联文件名

然后文件对象以只写方式打开,打开成功的话获取编辑区内容并将其转换为纯文本格式,转换完毕后将纯文本内容传递给Qstring类型变量,最后文件对象使用写入函数将数据转换为标准字符串格式或者UTF8类型写入到指定路径的文件夹中,最后将文件对象关闭。

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->QbuteArray
        //   file.write( str.toUtf8());
           file.write(str.toStdString().data());  //纯C++
 
       }
      file.close();
 
   }
}

二、二进制文件读写

数据流操作使用二进制文件的形式,头文件为QDataStream,用于处理视频、音频等,例如文件的写入:

void Widget::writeData()

{

    //创建文件对象

    QFile file("../test.txt");

 

    //打开文件,只写方式打开

    bool isOk=file.open(QIODevice::WriteOnly);

    if(true==isOk)

    {

        //关联数据流,和file文件关联

        //往数据流中输入数据,相当于往文件 里写数据

        QDataStream stream(&file);

 

        stream<<QString("buyao")<<250;  //乱码  二进制操作

        file.close();

    }

}

最终在主函数中调用,会在设定的文件夹中建立一个test.txt文件夹,文件夹内容为二进制格式的写入数据。

二进制文件的读取:

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;   //.toUtf8().data()作用是显示中文

 

        file.close();

    }

}

三、文本文件读写

与二进制流文件数据读取类似:

void Widget::writeData()
{
    //创建文件对象
    QFile file;
    file.setFileName("../demo.txt");
    //打开文件,只写方式打开
    bool isOk=file.open(QIODevice::WriteOnly);
    if(true==isOk)
    {
        //关联数据流,和file文件关联
        //往数据流中输入数据,相当于往文件里写数据
        QTextStream stream(&file);
 
        //指定编码
        stream.setCodec("UTF-8");
 
        stream<<QString("buyao")<<250;  //文本
        file.close();
    }
}
 
 
void Widget::readData()
{
    //创建文件对象
    QFile file("../demo.txt");
 
    //打开文件,只读方式打开
    bool isOk=file.open(QIODevice::ReadOnly);
    if(true==isOk)
    {
        //关联数据流,和file文件关联
        //往数据流中输入数据,相当从往文件里读数据
        QTextStream stream(&file);
        //指定编码
        stream.setCodec("UTF-8");
 
        //读的时候按写的顺序取
        QString str;
        int a ;
        stream>>str>>a;
       // qDebug()<<str.toUtf8().data()<<a;
 
        cout<<str.toUtf8().data()<<a;
 
        file.close();
    }
}
 
void Widget::on_pushButton_clicked()
{
    QString path=QFileDialog::getOpenFileName(this,
                                              "open","../");  //不指定格式
    if(false==path)
    {
        QFile file(path);
 
        //打开文件,只读方式打开
        bool isOk=file.open(QIODevice::ReadOnly);
        if(true==isOk)
        {
            //关联数据流,和file文件关联
            //往数据流中输入数据,相当从往文件里读数据
            QTextStream stream(&file);
            //指定编码
            stream.setCodec("UTF-8");
 
            //
          QString str =  stream.readAll();
          ui->textEdit->setText(str);
   }
 
    }
 
} 
原文地址:https://www.cnblogs.com/luxinshuo/p/12238556.html