12、文件操作

1、文件系统

  QIODevice

    -----QBuffer内存文件

    -----QProcess进程相关

    -----QFileDevice文件描述符类似操作

      ---QFile

        ---QTemporaryFile

    ----QAbstractSocket

      ---QTcpSocket---->QSslSocket

      ---QUdpSocket

2、读文件操作

  1、一次性读完

QString path = QFileDialog::getOpenFileName(this,
         "open","../","TXT(*.txt)");
    if(path.isEmpty() == false)
    {
        // 文件对象 打开文件
        QFile file(path);
        bool isok = file.open(QIODevice::ReadOnly);
        
        if(isok == true)
        {
            // 读文件   一次读完
            QByteArray arr = file.readAll();
            // 显示到编辑区
            ui->textEdit->setText(arr);
        }
        file.close();
    }

  2、一行一行读取数据

QByteArray buf;
        while(file.atEnd() == false)
        {
           buf += file.readLine();
        }
        ui->textEdit->setText(buf);

3、写文件操作

  1、保存文件

 void Widget::on_buttonWrite_clicked()
{
     // 返回新建文件路径及名称 ,并将按照指定格式、目录、新建文件
    QString filename = QFileDialog::getSaveFileName(this,
          "save","../","TXT(*.txt)");
    if(filename.isEmpty() == false)
    {
        QFile file;
        file.setFileName(filename);  // 关联文件名称
       // 打开文件夹
        bool isok = file.open(QIODevice::WriteOnly);
        if(isok == true)
        {
            // 获取编辑区内容
            QString str = ui->textEdit->toPlainText();
            // 写文件
            // 将QString-->String--->Char*
            file.write(str.toStdString().data());
        }
        file.close();
    }
}

  2、格式转换

// QString--->QByteArray
QString str = 123; 
str.toUtf8()    // qt4中不支持,qt5支持 中文使用比较友好

// QString---》QByteArray  本地编码 适合本平台的QByteArray
QString str1 = "12346";
QByteArray a = str1.toLocal8Bit();   // 转换为QByteArray

// QByteArray-->char*
QByteArray a;
char *p = a.data();

// QString---》QByteArray-->char*

// 将QString-->String--->Char*
file.write(str.toStdString().data());


// Char* -->QString
char* p = "acvf";
QString c = QString(p);

4、获取文件信息

 QString path = QFileDialog::getOpenFileName(this,
         "open","../","TXT(*.txt)");

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

5、QDataStream 读写文件

  1、主要用来读写二进制文件,因此可以用来读写音频文件

  2、读写顺序需要对应,第一次写什么类型的数据、读的时候,需要按照那个类型先读;

// 写文件操作
void Widget::writeData()
{
    // 创建一个文件对象
    QFile file("../test.log");

    // 打开文件
    bool isok = file.open(QIODevice::WriteOnly);
    if(isok == true)
    {
        // 创建一个数据流对象
        // 数据流对象与文件关联起来  对数据流的操作相当于对文件操作
        QDataStream stream(&file);
        stream << QString("主要看素质")<< 230;
        file.close();
    }
}
// 读文件操作
void Widget::readData()
{
    // 创建一个文件对象  并与test.log 文件相关起来
    QFile file("../test.log");

    // 打开文件
    bool isok = file.open(QIODevice::ReadOnly);
    if(isok == true)
    {
        // 创建一个数据流对象
        // 数据流对象与文件关联起来 对流操作相当于对文件操作
        QDataStream stream(&file);
        QString str;
        int a;
        stream >> str >>a;
        // 需要转换格式
        //qDebug() << str.toUtf8().data()<< a;
        cout << str.toUtf8().data()<< a;
        file.close();
    }
}

6、常用的调试打印信息

#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"
// 中间两个C语言中的宏,可以用来调试使用

// [ ..\QDateStream\widget.cpp : 57 ] 主要看素质 230

7、QTextStream 以文本的形式操作文件

  1、可以指定编码格式,不局限于二进制格式

  2、写操作的时候指定了编码格式,读的时候必须比配相应的格式

// 写文件操作
void Widget::writeTextData()
{
    QFile file;
    file.setFileName("../test1.log");   // 与QFile file("../test1.log"); 一样

    bool isok = file.open(QIODevice::WriteOnly);
    if(true == isok)
    {
        QTextStream stream(&file);   // 将文件与数据流关联
        // 指定数据流格式 为utf8  若不指定 会适配本地的编码
        stream.setCodec("UTF-8");
        // 会将输入的信息已指定的格式转为字符串
        stream << QString("今天不天气哈不错")<< 120;
    }
    file.close();
}
/// 读文件操作
void Widget::readTextData()
{
    QFile file;
    file.setFileName("../test1.log");   // 与QFile file("../test1.log"); 一样

    bool isok = file.open(QIODevice::ReadOnly);
    if(true == isok)
    {
        QTextStream stream(&file);   // 将文件与数据流关联
        // 指定写时候的数据流格式  读的时候必须匹配格式
        stream.setCodec("UTF-8");
       // 读数据与二进制文件操作不同  需要按照文本格式读取
        QString str = stream.readAll();
        //stream.readLine();
        qDebug() << str;
    }
    file.close();
}

8、内存文件QBuffer

  1、类似于文件的打开、写操作

  2、写操作,将数据写入内存缓冲区中;

// 简单操作
QBuffer buf; // 创建一个内存缓冲文件
    buf.open(QIODevice::WriteOnly);
    buf.write("11111111111111"); // 数据写入缓冲区
    buf.write("2233333333333333");
    buf.write("秦川抒怀");
    buf.close();
    qDebug() << (buf.buffer()).data();   // 输出 字节数组中文乱码 需要转

// QBuffer指定写入的设备
    QByteArray arr;
    QBuffer buffer(&arr);   // 数据写入字节数组 作为缓冲区
    buffer.open(QIODevice::WriteOnly);
    buffer.write("11111111111111"); // 数据写入缓冲区
    buffer.write("2233333333333333");
    buffer.write("秦川抒怀");
    buffer.close();
    qDebug() << (buffer.buffer()).data();   // 输出 字节数组中文乱码 需要转
    qDebug() << arr.data();    // 打印字节数组中的内容


// 给设备写入文件 配合datastream使用
    QBuffer devbuf;
    devbuf.open(QIODevice::WriteOnly | QIODevice::ReadOnly);   // 需要打开才能被指定
    QDataStream stream(&devbuf); // 指定内存文件 需要先打开
    stream << QString("QBuffer和QDataStream配合使用")<< 140;
    // 试用完成需要关闭
    devbuf.close();
    qDebug() << devbuf.buffer();

// 读取设备中的数据
    // 打开设备
    devbuf.open(QIODevice::ReadOnly);
    QDataStream s1;
    s1.setDevice(&devbuf);
    QString str;
    int a;
    s1>> str>>a;
    devbuf.close();
    qDebug() << str.toUtf8().data()<< a;
View Code

 

posted @ 2020-08-06 18:04  笑不出花的旦旦  阅读(89)  评论(0)    收藏  举报