文件系统:
文件操作是APP应用程序中不可缺少的一部分。 Qt作为通用的开发库,提供跨平台的文件操作功能。 Qt通过QIODevice提供I/O设备的抽象,这些设备有读写字节块的能力。 以下是I/O设备的类图(Qt5 )。
QIODevice :所有I/O设备类的父类。 提供字节块的读写和基本接口。
QFileDevice:Qt5中新添加的类为文件操作提供了通用实现。
QFlie :访问本地文件或嵌入资源;
QTemporaryFile :创建和访问本地文件系统的临时文件;
QBuffer :读写q字节、内存文件;
QProcess :运行外部程序,处理进程间通信;
QAbstractSocket :所有套接字类的父类;
QTcpSocket:TCP协议网络的数据传输;
qudpsocket :发送UDP消息;
qsl套接字:使用SSL/TLS传输数据;
文件系统分类:
顺序访问设备:
指那些数据只能访问一次。 从头到尾,从第一个字节访问到底,中途不能返回读取上一个字节。 其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。
随机访问设备:
可以任意次数访问任意位置。 QIODevice:seek ) )函数还可以重新定位文件访问位置指针。 QFile、QTemporaryFile和QBuffer是随机接入设备。
基本文件操作:
文件操作是APP应用程序中不可缺少的一部分。 Qt作为通用的开发库,提供跨平台的文件操作功能。 文件I/O是所有I/O设备中最重要的部分之一。 因为大多数程序仍然需要访问本地文件。 当然,在云计算大行其道的未来,这一观点可能会发生改变。 QFile提供从文件中读取和写入数据的功能。
通常,文件路径作为参数传递给QFile的构造函数。 但是,创建对象后,也可以使用setFileName ()进行修改
QFile主要提供有关文件的各种操作,如打开、关闭和更新文件。 q可以使用QDataStream或QTextStream类读写文件,也可以使用QIODevice类提供的read (、readLine )、readAll (、write ) )等函数。 值得注意的是,有关文件本身的信息(如文件名和文件所在目录的名称)来自QFileInfo,而不是自行分析文件路径字符串。
*举个例子,设计**文本框,读写数据,保存在本地文件下
写文件:
void构件: on _ BTN _ write _ clicked ({ qstring path=qfiledialog 33603360 get savefilename,' write ' if (path . //打开创建对象file.setfilename(path )的//文件,只写bool isok=file.open (qiodevice 33603360 write only ) //将读取的文本写入文件file对象//文件写入函数是qbytearray类型的数据,因此需要在写入之前将str直接转换为bytearray类型//Qt的函数,在to utf8 (fftf8) (} file.close ); }1:第一步,设置文件路径的QFileDialog包含一个对话框,用户可以在其中选择文件或目录。 此外,用户还可以遍历文件系统,以便选择一个或多个文件或目录。
2 )设置文本的名称或路径
3 :打开文本,与file.open ()和file.close ) )一起使用。 实际上,qt文本在关闭时实际写入数据。 可以在不写关闭的函数的情况下查看写入文件的数据。 我们打开文本时,可以选择要打开的格式。
枚举值的说明
QIODevice:NotOpen未打开
QIODevice:ReadOnly打开为只读
io device :3360只写操作打开
QIODevice:ReadWrite将读写打开
iodevice:3360append
以追加的方式打开,新增加的内容将被追加到文件末尾 QIODevice::Truncate 以重写的方式打开,在写入新的数据时会将原有 数据全部清除, 游标设置在文件开头。
QIODevice::Text 在读取时,将行结束符转换成 n;在写入时,将行结束符转换成本地格 式,例如 Win32 平台上是 rn
QIODevice::Unbuffered 忽略缓存
读文件:
void Widget::on_btn_read_clicked(){ QString path = QFileDialog::getOpenFileName(this,"打开","../"); if(path.isEmpty() == false) { //创建文件对象 QFile file(path); bool isok = file.open(QIODevice::ReadOnly); //只读模式打开 if(isok == true) {#if 1 //读文件 QByteArray array = file.readAll(); //将数据写进文本框中 ui->textEdit->setText(QString(array));#else //一行一行的读 QByteArray array; while(file.atEnd() == false) { array += file.readLine(); } ui->textEdit->setText(QString(array).toUtf8().data());#endif} file.close(); //获取文件信息 QFileInfo info(path); qDebug()<<"文件名字:"<< info.fileName(); qDebug()<<"文件后缀:"<< info.suffix(); qDebug()<<"文件大小:"<< info.size(); qDebug()<<"文件创建时间:"<< info.created().toString("yyyy-MM-dd hh:mm:ss"); //yyyy代表年 MMd }}读文件跟写文件差不多,这里我们主要说一下,如果我们需要文件的相关信息,比如路径,大小,格式等。并不是去索引这个文件路径然后获取相关信息。在qt中有一个QFileInfo的类,他有很多的函数 是用来获取文本信息的。例如:
isDir()检查该文件是否是目录;
isExecutable() 检查该文件是否是可执行文件等。
baseName() 可以直接获得文件名;
completeBaseName() 获取完整的文件名
suffix() 则直接获取文件后缀名。
completeSuffix() 获取完整的文件后缀
以上我们读写文件方式都是使用的QIODevice提供的函数,接下来我们看看怎么使用QDataStream二进制读写文件。
QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。
二进制文件写操作:
二进制文件读操作:把写进去的数据读出来
//创建文件 对象 QFile file("../test.txt"); bool isok = file.open(QIODevice::ReadOnly); if(isok == true) { QDataStream stream(&file); //读取数据时 按照写入的顺序读取 QString str; int a; stream >> str >>a ; cout << str.toUtf8().data() << a; }
唯一需要注意的是,你必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃 就是我先写的qstring的值,然后再写的int值。我们在读取的时候也是先取出qstring的值 然后在读取int型的值。循序不能出错
那么,既然QIODevice提供了read()、readLine()之类的函数,为什么还要有QDataStream呢?QDataStream同QIODevice有什么区别?区别在于,QDataStream提供流的形式,性能上一般比直接调用原始 API 更好一些。
文本文件读写
虽然QTextStream的写入内容与QDataStream一致,区别在于读取时不一致:
在 QDataStream中读取数据时,stream >> str >>a ; cout << str.toUtf8().data() << a;
在QTextStream中读取数据时,stream >>str ; cout << str;
两者的输出结果都是一样的,可以看出在使用QTextStream的时候,不需要定义一个int的变量a来存储读出的int类型的数据250。这是因为当使用QDataStream写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而以文本形式写入数据,是没有数据之间的分隔的。