QT_文件操作

IO设备操作介绍

QIODevice类是Qt中所有I/O设备的基接口类。QIODevice为支持读写数据块的设备提供了通用实现和抽象接口,例如QFile、QBuffer和QTcpSocket。QIODevice是抽象的,不能实例化,但通常使用它定义的接口来提供与设备无关的I/O功能。

复制代码
QIODevice       所有I/O设备类的父类,提供读写的通用操作
QFileDevice     Qt5新增的类,提供了有关文件操作的通用实现
QFile           访问本地文件或嵌入资源
QTemporaryFile  创建和访问本地文件系统的临时文件
QBuffer         读写QByteArray
QProcess        运行外部程序,处理进程间通信
QAbstractSocket 所有套接字类的父类
QTcpSocket      TCP协议网络数据传输
QUdpSocket      传输UDP报文
QSslSocket      使用SSL/TLS传输数据

函数接口

复制代码
bool    open(OpenMode   mode);  //打开设备

qint64  read(char *data, qint64 maxSize)
QByteArray  read(qint64 maxSize)

qint64  write(const char *data, qint64 maxSize)
qint64  write(const char *data)
qint64  write(const QByteArray &byteArray)

void close();   //关闭设备
QFile操作文件
复制代码
QFile   file("test.txt");
打开:   file.open();
关闭:   file.close();
判断文件是否存在: [static]  QFile::exists(fileName);
拷贝文件: file.copy(copyFileName);
移除文件: [static]  QFile::remove(fileName);
读取文件: file.readLine();
         file.readAll();
获取文件大小: file.size();

相关代码:

复制代码
QFile file("E://hello.txt");    //创建QFile对象
file.open(QFile::ReadWrite);    //以读写方式打开文件
file.write("hello world");      //向文件中写入hello world
file.flush();   //将缓冲区数据加载到磁盘
file.seek(0);   //重置偏移量
QByteArray byteArray = file.readAll();  //读取文件数据
qDebug() << QString(byteArray);     //转化输出
file.close();   //关闭文件
QFileInfo fileInfo(file);   //获取文件相关信息
qDebug() << fileInfo.size() //文件大小
qDebug() << fileInfo.baseName();    //文件名(不带后缀)
qDebug() << fileInfo.suffix();  //文件后缀名
qDebug() << fileInfo.absolutePath();        //不带文件名
qDebug() << fileInfo.absoluteFilePath();    //带文件名
QTextStream 文本流

向文本流中写入的任何东西都会自动转成字符串存储
示例代码:

复制代码
QFile file("E://hello.txt");
file.open(QFile::ReadWrite);
QTextStream out(&file);
out << "hello" << "World";
out.flush();
file.seek(0);
qDebug() << out.readAll();
file.close();

在内部,QTextStream使用基于Unicode的缓冲区,QTextStream使用QTextCodec自动支持不同的字符集。默认情况下,QTextCodec::codecForLocale()用于读写,但您也可以通过调用setCodec()来设置编解码器。

复制代码
QTextCodec *codec = stream.codec();
QByteArray arr = codec->name();     //System

在Windows读出来的是system,就是默认编码是系统的编码(ANSI格式编码)。

QTextCodec::availableCodecs()可以查看支持的编码格式

指定编解码格式

复制代码
//指定"utf-8"格式读取文件文本内容
QFile file("D:\\abc.txt");
bool ok = file.open(QFile::ReadOnly);
QTextStream ts(&file);
qDebug() << ts.codec()->name();
ts.setCodec("utf-8");
qDebug() << ts.readAll();
file.close();
QDataStream 数据流

QDataStream类用于将任意常见类型的数据以二进制写入到指定的目标中,同时也可以按写入的顺序从目标中读取这些类型的数据,实现数据的序列化。

数据流写入
复制代码
//构造函数
QDataStream()
QDataStream(QIODevice *d)
QDataStream(QByteArray *a, QIODevice::OpenMode mode)
QDataStream(const QByteArray &a)

//写入数据函数
QDataStream &writeBytes(const char *s, uint len)//写入的时候,包含Qt自己的想法
int writeRawData(const char *s, int len)//实际什么数据就写入什么数据
QDataStream &operator << (qint8 i)//运算符重载函数

QDataStream方法

复制代码
QDataStream &QDataStream::writeBytes(const char *s, uint len)
{
    CHECK_STREAM_WRITE_PRECOND(*this)

    *this << (quint32)len;  //write length specifier
    if(len)
    {
        writeRawData(s, len);   //write raw data
    }

    return *this;
}

相关代码

复制代码
QFile file("D:\\abc.txt");
bool ok = file.open(QFile::WriteOnly | QFile::Truncate);
if(!ok)
{
    qDebug() << "Fail to open : " << file.errorString();
    return -1;
}
QDataStream ts(&file);
ts  <<  "tiechui";
ts  <<  30;
ts  <<  90.8;
file.close();

注意:

QDataStream在使用writeBytes方法写入QString, QByteArray, QPicture, const char*时, 会在写入数据之前加入4byte数据长度信息。

数据流读取
复制代码
//读取数据
QDataStream &readBytes(char *&s, uint &l)
int readRawData(char *s, int len)
QDataStream &operator   >>  (qint8 &i)  //运算符重载函数

相关代码

复制代码
QFile file("D:\\abc.txt");
bool ok = file.open(QFile::ReadOnly);
if(!ok)
{
    qDebug() << "Fail to open : " << file.errorString();
    return -1;
}
QDataStream ds(&file);
quint32 len = 10;
char *name = new char[len];
quint32 age;
qreal   score;
ts.readBytes(name,len);
ts  >> age;
ts  >> score;

qDebug()    <<  "Len    : " << len;
qDebug()    <<  "Name   : " << name;
qDebug()    <<  "Age    : " << age;
qDebug()    <<  "Score  : " << score;

file.close();
delete  []name;
相关推荐
Laurence4 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
蒸汽求职5 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
charlee445 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
Tanecious.5 小时前
蓝桥杯备赛:Day4-P9749 公路
c++·蓝桥杯
旖-旎5 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法
Tanecious.6 小时前
蓝桥杯备赛:Day3-P1102 A-B 数对
c++·蓝桥杯
Tanecious.6 小时前
蓝桥杯备赛:Day3-P1918 保龄球
c++·蓝桥杯
良木生香6 小时前
【C++初阶】:C++类和对象(下):构造函数promax & 类型转换 & static & 友元 & 内部类 & 匿名对象 & 超级优化
c语言·开发语言·c++
三雷科技7 小时前
使用 `dlopen` 动态加载 `.so` 文件
开发语言·c++·算法
旖-旎8 小时前
分治(快速选择算法)(3)
c++·算法·leetcode·排序算法·快速选择