• Qt文件读写操作


    原文地址:https://www.cnblogs.com/flowingwind/p/8336159.html

    QFile Class

    1.read读文件

    • 加载文件对象  QFile file("文件地址");
    • 打开加载的文件file.open(打开方式);
    • 操作文件
    • 关闭打开的文件file.colse();
    复制代码
    void Widget::on_pushButton_clicked()
    {
        QFile file("L:/qtpro/_qtApp/text/t.txt");
        file.open(QIODevice::ReadOnly | QIODevice::Text);
        QByteArray t = file.readAll();
        ui->text_r->setText(QString(t));
        file.close();
    }
    复制代码

    2.wirte写文件

    • 以纯文本的形式读取要保存文件到QString对象 //ui->text_e->toPlainText();
    • 创建QFile 对象保存文件
    • 打开QFile对象
    • 写入文件操作
    • 关闭打开的文件;
    复制代码
    void Widget::on_pushButton_2_clicked()
    {
        QString e = ui->text_e->toPlainText();
        QFile file("L:/qtpro/_qtApp/text/e.txt");
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        file.write(e.toUtf8());
        file.close();
    }
    复制代码

    细节优化处理

    • read文件添加读取文件选择项 QFileDialog::getOpenFileName();
    • 打开文件是否成功的判断;
    • 按行读取文件,可控制读取行数与每行字符数;
    • write文件创建保存路径QFileDialog::getSaveFileName(); 
    复制代码
    void Widget::on_pushButton_clicked()
    {
        QFile file;
        QString f = QFileDialog::getOpenFileName(this, QString("选择文件"), QString("/"),QString("TEXT(*.txt)"));
        file.setFileName(f);
        if(file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QByteArray t ;
            while(!file.atEnd())
            {
                t += file.readLine();
            }
            ui->text_r->setText(QString(t));
            file.close();
        }
    }
    
    void Widget::on_pushButton_2_clicked()
    {
        QString e = ui->text_e->toPlainText();
        QFile file;
        file.setFileName(QFileDialog::getSaveFileName(this, QString("保存路径"), QString("/"),QString("TEXT(*.txt)")));
        file.open(QIODevice::WriteOnly | QIODevice::Text);
        file.write(e.toUtf8());
        file.close();
    }
    复制代码

    各编码转换

    QString -> QByteArray      QString.toUtf8();

    QByteArray -> std::string  QByteArray.toStdString();

    std::string -> char *        string.date();

    常用静态函数:

    QFileDialog::getOpenFileName()    //获取指定文件路径名返回QString

    QFileDialog::getExistingDirectory()  //获取指定路径返回QString

    QFileDialog::getSaveFileName()    //获取指定保存路径返回QString

    辅助配合使用的类:

    QFileInfo class

    获取文件信息;

    复制代码
    QFileInfo类用于读取文件的属性信息
    
        QFile file(f);
        QFileInfo info(file);
      
        qDebug() << info.exists();
        qDebug() << info.isFile();
        qDebug() << info.isReadable();
        qDebug() << info.isWritable();
        qDebug() << info.created();
        qDebug() << info.lastRead();
        qDebug() << info.lastModified();
        qDebug() << info.path();
        qDebug() << info.fileName();
        qDebug() << info.suffix();
        qDebug() << info.size();
    复制代码

    二、文本流与数据流

    QT中将文件分为文本文件和数据文件,文本文件内容是可读的文本字符,数据文件的内容是二进制数据。

    QFile直接支持文本文件和数据文件的操作,主要函数接口如下:

    •     qint64 read( char * data, qint64 maxSize) //数据流读取
    •     QByteArray read( qint64 maxSize) //文本流方式读取
    •  QByteArray readAll() //文本流方式读取
    •  QByteArray readLine()//文本流方式读取
    •     qint64 write(const char * data, qint64 maxSize)
    •     qint64 write(const QByteArray & byteArray)

    为了简化文本文件和数据文件的读写操作,QT提供了QTextStream和QDataStream辅助类。QTextStream可将写入的数据全部转换为可读文本,QDataStream可将写入的数据根据类型转换为二进制数据。

    QTemporaryFile是QT中的临时文件操作类,用来安全创建全局唯一的临时文件,QTemporaryFile对象销毁时对应的临时文件将被删除,临时文件的打开方式为QIODevice::ReadWrite,临时文件常用于大数据传递或者进程间通信场合。

    复制代码
    QTemporaryFile tempFile;
    if( tempFile.open() )
    {  
        tempFile.write("D.T.Software");
        tempFile.close();
    }
    
    复制代码

    QDataStream Class

    数据流操作文件:

    创建流对象 QDataStream date;

    int a= xxxx;

    string b = "xxxxxxxxx" ;

    将数据存在流中 date >> a >> b;

    int aa;

    string bb;

    从流中取出数据 date << aa << bb;

    QDataStream在不同的QT版本中数据流文件格式可能是不同的,如果数据流文件需要在不同版本的QT程序间传递时需要考虑版本问题。

    void setVersion(int v)

    int version() const

    QTextStream Class

    文本方式操作文件:

    创建流对象 QTextStream date;

    date.setCodec();支持对文件读取编码设置(有效解决乱码问题)

    QBuffer

     QBuffer类为QByteArray提供QIODevice接口。

    目前先理解为一个创建一个缓存文件;

    QT中预定义了缓冲区的类QBuffer,可以将缓冲区看成一种特殊的IO设备,文件流辅助类可以直接用于操作缓冲区。QBuffer缓冲区写入和读取的数据必须是同一种数据类型,不能混合多种数据类型。

        QBuffer的使用场合:

        A、线程间不同类型的数据传递

        B、缓存外部设备中的数据返回

        C、数据读取速度小于写入速度

    总结:

    读写操作主要方法有read();readAll();readline(),write();

    附录:

    目录操作

    1、QDir

        QT中提供了目录操作类QDir,QDir功能如下:

        A、目录分隔符统一使用’/’

        B、能够对目录进行任意操作(创建、删除、重命名)

        C、能够获取指定目录中的所有条目(文件和文件夹)

        D、能够使用过滤字符串获取指定条目

        E、能够获取系统中的所有根目录

        QDir使用方法如下:

    复制代码
     QDir dir;
        QString path("../qt/test");
        if(!dir.exists())
        {
            dir.mkdir(path);
        }
        else
        {
            dir.cd(path);
            QStringList list = dir.entryList();
            for(int i = 0; i < list.count(); i++)
            {
                qDebug() << list[i];
            }
        }
    
    //计算文件大小
    unsigned int FileSize(QString path)
    {
        QFileInfo info(path);
        unsigned int ret = 0;
        if(info.isFile())
        {
            ret = info.size();
        }
        else if(info.isDir())
        {
            QDir dir(path);
            QFileInfoList list = dir.entryInfoList();
            for(int i = 0; i < list.count(); i++)
            {
                if((list[i].fileName() != ".") && (list[i].fileName() != ".."))
                {
                    ret += FileSize(list[i].absoluteFilePath());
                }
            }
        }
        return ret;
    }
    复制代码

    2、QFileSystemWatcher

    QT中预定义了用于监控文件和目录变化的类QFileSystemWatcher,

    QFileSystemWatcher主要功能如下:

        A、能够监控特定目录和文件的状态

        B、能够同时对多个文件和目录进行监控

        C、当目录或文件发生改变时触发信号

        D、通过信号与槽的机制捕捉信号并做出响应

        通常要使用QFileSystemWatcher需要自定义文件监视类。

  • 相关阅读:
    生成函数代替伯努利数
    关于费用流
    GDOI注意事项
    计算几何 学习笔记
    jzoj5370
    图上的游戏
    小学生语文题
    arcane
    P2305 [NOI2014] 购票
    P3512 [POI2010]PIL-Pilots
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/11314930.html
Copyright © 2020-2023  润新知