首页 > 其他分享 >17、文件读写文本文件(QFile类)

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

时间:2023-12-13 14:47:00浏览次数:29  
标签:文件 17 QFile 写入 文本文件 QIODevice include 读写

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();
}

 

标签:文件,17,QFile,写入,文本文件,QIODevice,include,读写
From: https://www.cnblogs.com/baisedeyu/p/17897241.html

相关文章

  • 洛谷 P1217
    原题链接:一开始的思路:把数字转换成字符串类型并将字符串反转,若反转后的字符串和原来的字符串一致且该数是质数,则是回文质数。#include<bits/stdc++.h>usingnamespacestd;boolisPrime(intx){if(x<2)returnfalse;for(inti=2;i<=x/i;i++){......
  • [Codeforces] CF1737C Ela and Crickets
    CF1737CElaandCrickets题意给定一个\(n\timesn\)的棋盘,棋盘上有且仅有三颗排成\(\text{L}\)形的棋子。对于\(\text{L}\)形的定义,有且仅有以下四种情况:棋子的移动规则和跳棋相同。它可以水平、垂直或斜向移动。当且仅当一个棋子的某个方向紧随另一个棋子时,它能跳......
  • 苹果iOS 17.2正式版发布!iPhone 15 Pro系列必升:新增空间视频、操作按钮翻译
    今日凌晨,苹果正式发布iOS17.2正式版升级,作为iOS17第二次大版本更新,iOS17.2带来多项新功能和错误修复。首先来看iOS17.2为iPhone15Pro系列带来的独占功能。更新后,iPhone15Pro、iPhone15ProMax上的自定义操作按钮新增翻译功能。当需要翻译时,可直接通过自定义操作按钮......
  • 即时通讯技术文集(第27期):实时音视频技术合集(Part2) [共17篇]
    ​为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第27 期。[- 1 -] 专访微信视频技术负责人:微信实时视频聊天技术的演进[链接] http://www.52im.net/thread-1201-1-1.html[摘要] 本次专访是对谷沉沉老师在即将到来的2017Ar......
  • CF1793C Dora and Search
    CF1793CDoraandSearchDifficulty:1200题意翻译题目描述给定一个长度为\(n\)的排列\(a\),问是否存在正整数\(l,r\)使得\(a_l,a_r\)均不为\(a_{l...r}\)中的最大值或最小值。输入输出格式第一行一个正整数\(t\),表示数据组数。接下来对于每组数据输入包括两行,第一......
  • spec cpu 2017
    官网: https://www.spec.org/cpu2017/  参考:Speccpu2017介绍  https://blog.csdn.net/admking/article/details/109069465 spec2017安装和使用 https://blog.csdn.net/admking/article/details/109069465https://www.jianshu.com/p/5c085f295cff SPECCPU简介和......
  • selenium运行时的ValueError: Timeout value connect was <object object at 0x000001
    fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get("https://www.baidu.com/")运行时出现ValueError:Timeoutvalueconnectwas<objectobjectat0x000001FE483C4170>错误大概率原因是:selenium和urllib3库的版本冲突导致修改版本为:selenium=3.1......
  • P4170 [CQOI2007] 涂色(天赋哥不要点进来)
    前言翻遍洛谷题解,看到大家都在套模板,却很少有人讲出为什么,使我十分崇拜天赋哥。原题链接关于这题的一些事实性证据事实1.来自事实2.来自事实3.来自事实4.来自整理上述事实1.每一次”最短“最优涂色,要么在其他颜色的基础上涂,这称之为融入一个整体;要么另辟蹊径单独......
  • ClickHouse(17)ClickHouse集成JDBC表引擎详细解析
    目录JDBC建表用法示例JDBC表函数资料分享参考文章JDBC允许CH通过JDBC连接到外部数据库。要实现JDBC连接,CH需要使用以后台进程运行的程序clickhouse-jdbc-bridge。该引擎支持Nullable数据类型。建表CREATETABLE[IFNOTEXISTS][db.]table_name(columnslist...)E......
  • 实验六 周天意 202383290417
    实验六实验内容1.实验任务1验证性实验。输入代码,结合运行结果,观察、理解以下用法:结构体类型的定义结构体数组的输入、输出、元素访问结构体数组作为函数参数结构体类型作为函数返回值类型问题场景描述:学生成绩包括:学号、姓名、课程名称、平时成绩、期中成绩、期末成绩、总评成......