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需要自定义文件监视类。

posted @ 2019-08-07 14:12  狂奔~  阅读(10105)  评论(0编辑  收藏  举报