17、文件读写文本文件(QFile类)

发布时间 2023-12-13 14:37:01作者: 秃头的C#

QFile类

QFile是Qt中的一个类,用于读写文件。它提供了一些基本的文件操作方法,如打开、关闭、读取和写入等。

QFile的构造函数

QFile的构造函数有两个参数,一个是文件的名字,另一个是父对象指针。

QFile::QFile(const QString &name, QObject *parent = nullptr)

 

QFile的打开与关闭

使用open()方法可以打开一个文件,close()方法可以关闭文件。

bool open(OpenMode mode) void close()

其中open()方法的参数是打开模式,常见的打开模式有:

  • QIODevice::ReadOnly:只读模式
  • QIODevice::NotOpen: 设备未打开。
  • QIODevice::ReadOnly: 只读模式,只能读取数据。
  • QIODevice::WriteOnly: 只写模式,只能写入数据。
  • QIODevice::ReadWrite: 读写模式,既可以读取也可以写入数据。
  • QIODevice::Append: 以附加方式打开,即写入数据时不覆盖已有数据,而是添加到文件末尾。
  • QIODevice::Truncate: 打开文件时截断文件,即将文件长度设置为0。
  • QIODevice::Text: 文本模式,自动转换文本文件的换行符(例如\n转换为\r\n)。
  • QIODevice::Unbuffered: 不使用缓冲区,直接读取或写入底层设备。

QFile的读写

QFile的读写方法有很多种,常用的有read()、write()、readLine()等。

qint64 read(char *data, qint64 maxSize) 
qint64 write(const char *data, qint64 maxSize) 
QByteArray readAll() QString readLine(qint64 maxSize = 0)

其中read()方法用于读取数据到指定的缓冲区中,write()方法用于将数据写入文件。readAll()方法可以一次性读取整个文件内容到一个QByteArray对象中,而readLine()方法则用于读取一行数据(以换行符为结束标志)。

QFile的属性

QFile还提供了一些属性用于获取文件的相关信息,比如文件名、路径、大小等。

QString fileName() const QString filePath() const qint64 size() const

QFile的错误处理

在使用QFile时,可能会出现一些错误,比如文件不存在、文件无法打开等。QFile提供了error()方法和errorString()方法用于处理这些错误。

QFile::FileError error() const QString errorString() const

其中error()方法返回一个枚举值,表示当前文件的错误状态,而errorString()方法则返回一个字符串,表示当前文件的错误信息。

 

案例

读取txt文件

#include <QCoreApplication>

#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //1:创建QFile对象,指定操作的相关文件
    QFile qfs("D:/myProject/QT/qtwidget/QFileText/QFileText/test1.txt");

    //2:打开文件 进行写入操作   ReadOnly  ReadWrite Append Truncate
    //Append 写入的时候追加到文件末尾
    //Truncate 重写文件
    //QIODevice::WriteOnly 标志指示文件只能以写入模式打开
    //QIODevice::Text 标志指示以文本模式打开文件
    if(!qfs.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug() <<"打开文件失败";
    }else{
        //不管文件有没有 都会自动创建一个
        qDebug() << "打开文件成功";
    }

    //3:向打开的文件写入数据
    qfs.write("qt开发学习");
    qfs.write("写入文件");
    qfs.write("哎!");

    //4:关闭文件
    qfs.close();


    //读取文件
    if(!qfs.open(QIODevice::ReadOnly|QIODevice::Text)){
        qDebug() <<"打开文件失败";
    }else{
        //不管文件有没有 都会自动创建一个
        qDebug() << "打开文件成功";
    }
    //定义一个字符指针
    char *pStr=new char[6];
    qint64 rcount=qfs.readLine(pStr,6);

    //读出错了 或者读取结束了 就结束循环
    while((rcount!=0)&& (rcount !=-1)){
        qDebug() << pStr<<endl;
        rcount=qfs.readLine(pStr,6);
    }
    qfs.close();



    return a.exec();
}

读写二进制文件

#include <QCoreApplication>

#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //将qnumber里的数据写入到文件中
    qint32 qnumber[3]={1,2,3};

    //将qnumber以二进制的方式存储到字节数组中
    QByteArray bytearray;
    bytearray.resize(sizeof(qnumber));

    for (int i = 0;  i< 3; i++) {
        //for循环利用指针将每个整数复制到字符数组里去
        memcpy(bytearray.data()+i*sizeof(qint32),&(qnumber[i]),sizeof(qint32));
    }

    //将bytearray字节数组存储至对应的文件当中QFileBinaryByte.dat
    QFile qfs("D:/myProject/QT/qtwidget/QFileText/QFileText/QFileBinaryByte.dat");

    if(!qfs.open(QIODevice::WriteOnly)){
         qDebug() <<"打开文件失败";
    }else{
        //不管文件有没有 都会自动创建一个
        qDebug() << "打开文件成功";
    }
    qfs.write(bytearray);
    qfs.close();


    //读取
    if(!qfs.open(QIODevice::ReadOnly)){
         qDebug() <<"打开文件失败";
    }else{
        //不管文件有没有 都会自动创建一个
        qDebug() << "打开文件成功";
    }

    QByteArray readArray=qfs.readAll();
    //输出读取二进制数据
    qDebug() << readArray;


    //将二进制数据转换为整数
    char *ctemp=readArray.data();
    while (*ctemp) {
        qDebug() << *(qint32*)ctemp;
        ctemp=ctemp + sizeof(qint32);
    }
    qfs.close();

    return a.exec();
}

配合QTextStream,QDataStream读写文件

#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include <QTextStream>
#include <QDataStream>
#include <QString>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QFile qfs("D:/myProject/QT/qtwidget/QFileText/QFileText/QTextStream.txt");

    if(!qfs.open(QIODevice::WriteOnly|QIODevice::Text)){
        qDebug() << "打开文件失败";
    }else{
        qDebug() << "打开文件成功";
    }

    QTextStream qtext(&qfs);

    //向文件写入数据
    qtext <<  QString("你好TextStream") << endl;

    qtext <<  QString("再见TextStream") << endl;

    qfs.close();


    //读取
    if(!qfs.open(QIODevice::ReadOnly|QIODevice::Text)){
        qDebug() << "打开文件失败";
    }else{
        qDebug() << "打开文件成功";
    }

    QTextStream readText(&qfs);
    while(!readText.atEnd()){
        QString strTemp;
        readText >> strTemp;
        qDebug() << strTemp;
    }
    qfs.close();

    return a.exec();
}