首页 > 编程知识 正文

qt读取ini中文配置文件,qt读取文件最后一行

时间:2023-05-05 23:26:49 阅读:41624 作者:2166

文件系统:

文件操作是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() 获取完整的文件后缀

//获取文件信息 QFileInfo info(path); qDebug()<<"文件名字:"<< info.fileName(); qDebug()<<"文件后缀:"<< info.suffix(); qDebug()<<"文件大小:"<< info.size(); qDebug()<<"文件创建时间:"<< info.created().toString("yyyy-MM-dd hh:mm:ss");

以上我们读写文件方式都是使用的QIODevice提供的函数,接下来我们看看怎么使用QDataStream二进制读写文件。
  QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
  QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。
二进制文件写操作:

//创建文件 对象 QFile file("../test.txt"); bool isok = file.open(QIODevice::WriteOnly); if(isok == true) { //创建数据流,和file文件关联起来,向数据流里面输入数据时,就是往文件里面写数据 QDataStream stream(&file); //stream 是二进制的数据,在文本显示为乱码 stream << QString("主要看气质") << 250; file.close(); }

二进制文件读操作:把写进去的数据读出来

//创建文件 对象 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写入的时候,实际上会在要写入的内容前面,额外添加一个这段内容的长度值。而以文本形式写入数据,是没有数据之间的分隔的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。