• 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);
       }
     
        }
     
    } 
  • 相关阅读:
    Windows 2003,XP安装Windows Phone 7 狼人:
    Android实例剖析笔记(六) 狼人:
    Android实例剖析笔记(一) 狼人:
    Android NDK带来什么 狼人:
    Windows Phone 7常用资源大集合 狼人:
    Android实例剖析笔记(七) 狼人:
    JDK环境变量配置
    jQuery去掉字符串起始和结尾的空格
    结构型设计模式
    主题:hibernate生成tree(基于注解方式)
  • 原文地址:https://www.cnblogs.com/luxinshuo/p/12238556.html
Copyright © 2020-2023  润新知