17、文件读写文本文件(QFile类)
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(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?