Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)

一、QFile

头文件:

#include<QFile>
#include<QFileDialog>

QFile 读文件

基本操作

通过按钮打开文件对话框

void Widget::on_pushButton_clicked()
{
    QString path =QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");
    if(path.isEmpty()==false)
    {
        //文件对象
        QFile file(path);

        //打开文件,只读方式打开
        bool isOk=file.open(QIODevice::ReadOnly);
        if(isOk==true)
        {
            //读文件    默认只utf8编码
            QByteArray arr=file.readAll();
            //显示到编辑区
            //ui->textEdit->setText(QString(arr));
            ui->textEdit->setText(arr);

        }
        //关闭文件
        file.close();
    }
}

这里为什么要用QByteArray 类呢因为是readall函数返回值决定
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)
翻译:从设备中读取所有剩余数据,并将其作为字节数组返回。
该函数没有报告错误的方法;返回一个空的QByteArray可能意味着当前没有可供读取的数据,或者发生了错误。

QByteArray简介:
QByteArray类提供了一个字节数组。
QByteArray可以用来存储原始字节(包括’\0’)和传统的8位’\0’结尾的字符串。使用QByteArray要比使用const char *方便得多。在后台,它总是确保数据后面有一个’\0’结束符,并使用隐式共享(写时复制)来减少内存使用,避免不必要的数据复制。

注意

这里的
//读文件 默认UFT-8编码
QByteArray arr=file.readAll();

打开txt文件时会出现乱码
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)
另存为UTF-8后
再打开就可以了
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)
另外
还有一种一行一行的读文件方式

while(file.atEnd()==false)
            {
                //读行
                arr +=file.readLine();
            }
            ui->textEdit->setText(arr);

也是默认读UTF8格式的

QFile写文件

void Widget::on_pushButton_2_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->QByteArray
            file.write(str.toUtf8());//特别是适用于有中文的情况            
        }

        file.close();
    }

}

根据write()函数
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)
其他转换方式;

//转换为本地平台编码
file.write(str.toLocal8Bit());
                      
//QString->c++ string->char*
file.write(str.toStdString().data());

//QString->QByteArray->char*
file.write(str.toUtf8().data());

保存到当前项目Debug文件上一级命名“测试.txt”
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)
Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)

二、QDataStream数据流文件

头文件

#include<QDataStream>

QDataStream写

void Widget::writeData()
{
    QFile file("../test.txt");

    //打开文件
    bool isOk=file.open(QIODevice::WriteOnly);
    if(isOk==true)
    {
        QDataStream stream(&file);

        //创建文件流,和file文件关联
        //往数据流输入数据,相当于往文件里写数据
        stream<<QString("咸鱼四号突突突")<<250;

    }
        file.close();
}

在构造函数调用读写后
打开test.txt文件后,你会发现文件乱码,可以通过toLocal8Bit()转成本地编码
(但是再读的时候就要根据编码转换比较麻烦)
这里暂且不管格式是什么。只要能通过读函数读出来就行

QDataStream读


void Widget::readData()
{
    QFile file("../test.txt");

    //打开文件
    bool isOk=file.open(QIODevice::ReadOnly);
    if(isOk==true)
    {
        //往数据流读数据,相当于往文件里读数据
        QDataStream stream(&file);
        //读的时候,按写的顺序
        QString str;
        int a;
        stream>>str>>a;

        qDebug()<<str.toUtf8().data()<<a;//转中文

    }
    file.close();

}

三、QTextStream

头文件

#include<QTextStream>

QTextStream写

----------------------------.h----------------------------------
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void writeData();
    void readData();

----------------------------.cpp--------------------------------
void Widget::writeData()
{
    QFile file;
    file.setFileName("../demo.txt");

    bool isOk=file.open(QIODevice::WriteOnly);
    if(true==isOk)
    {
        QTextStream stream(&file);
        //默认本地编码,也可以指定编码
        stream.setCodec("GB18030");

        stream <<QString("突突突!")<<250;

        file.close();

    }
}

QTextStream读

读文件时不要像QDataStream一样,因为QTextStream对读取的文件没有辨别类型的功能输出的只是字符串,做不到字符数字分离所以要使用下列方式:

QString path=QFileDialog::getOpenFileName(this,"open","../");
    if(path.isEmpty()==false)
    {
        QFile file;
        file.setFileName(path);

        bool isOk=file.open(QIODevice::ReadOnly);
        if(true==isOk)
        {

            QTextStream stream(&file);
            //指定编码
            stream.setCodec("UFT-8");

            QString str=stream.readAll();

            ui->textEdit->setText(str);

            file.close();
        }
    }

四、QFileInfo读取文件信息

头文件

#include<QFileInfo>
由于created返回值是QDataTime
所以还要包含头文件#include<QDateTime>
需要输出#include<QDebug>

用法

几个简单的函数,更多翻阅帮助文档

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

Qt学习笔记--文件读写(QFile、QDataStream、QTextStream)

上一篇:Linux环境下bool QFile::rename


下一篇:VS2015如何使用qss