QT实现对数据文本保存的办法及其操作
来源:互联网 发布:高斯滤波算法流程图 编辑:程序博客网 时间:2024/04/30 06:06
(1)文本文件(QTextStream流):文件内容是可读的文本字符
(2)数据文件(QDataStream流):文件内容是直接的二进制数据
QT对文本操作方式
1、QFile类,该类支持 对文件或者是数据文件的读写,提供的接口如下:
①qint64 read(char* data, qint64 maxSize);
②QByteArray read(qint64 maxSize);
③qint64 write(const char* data, qint64 maxSize);
④qint64 write(const QByteArray& byteArray);
该类暴露出来的缺点就是需要对数据类型的强制转换;
直接用QFile读写的实例代码
#include <QCoreApplication>#include <QFile>#include <QDebug>int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QFile file("C:/Users/SantaClaus/Desktop/test.hex"); if (file.open(QIODevice::WriteOnly)) //打开方式:可读、二进制方式 { QString name = "SantaClaus"; double value = 3.14; //按二进制写入时,须进行类型转换,这也是QFile使用上比较麻烦的地方 file.write(name.toStdString().c_str()); //参数为char*,须转换 file.write(reinterpret_cast<char*>(&value), sizeof(value)); file.close(); } if(file.open(QIODevice::ReadOnly)) //只读、二进制方式 { QString name =""; double value = 0; //read的返回值为QByteArray,当赋值给QString变量类型时进行自动转换 //以下语句也可以写成name = file.read(10); name = QString(file.read(10)); file.read(reinterpret_cast<char*>(&value), sizeof(value)); file.close(); qDebug() << name; qDebug() << value; } return a.exec();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
2、QFile结合使用辅助的文件流QTextStream;
QTextStream:写入的数据全部转换为可读文件
#include <QCoreApplication>#include <QFile>#include <QTextStream>#include <QDataStream>#include <QDebug>void textStream_test(QString f){ QFile file(f); if(file.open(QIODevice::WriteOnly | QIODevice::Text)) //以文本文式写入 { QTextStream out(&file); out << QString("SantaClaus") << endl; out << QString("Result: ") << endl; //以下故意输入多种类型的数据,但都被自动转换为QString类型,不需要显式转换! out << 5 << "*" << 6 << '=' << 5*6 << endl; file.close(); } if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while( !in.atEnd()) //未到文件尾 { QString line = in.readLine(); qDebug() << line; } file.close(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
3、QFile类结合使用数据文本流QDataStream;
QDataStream:写入的数据根据类型转换为二进制数据;
但值得注意的是:
A、不同Qt版本的数据流文件格式可能不同,当数据流文件需要在不同版本的Qt程序间传递数据时,需要考虑版本问题。
B、相关函数
void setVersion(int v); //设置读写版本号
int version() const //获取读写版本号
#include <QCoreApplication>#include <QFile>#include <QTextStream>#include <QDataStream>#include <QDebug>void dataStream_test(QString f){ QFile file(f); if(file.open(QIODevice::WriteOnly)) //以二进制方式打开 { QDataStream out(&file); //设置数据流的版本,以便在不同版本的Qt间进行数据传递 out.setVersion(QDataStream::Qt_5_6); out << QString("SantaClaus"); out << QString("Result: "); out << 3.14; file.close(); } if (file.open(QIODevice::ReadOnly)) { QDataStream in(&file); QString name = ""; QString result = ""; double value = 0; in.setVersion(QDataStream::Qt_5_6); in >> name; in >> result; in >> value; qDebug() << name; qDebug() << result; qDebug() << value; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
小结
(1)Qt中的文件辅助类用于方便读写操作
(2)QTextStream用于文本数据的快速读写
(3)QDataStream用于二进制数据的快速读写
(4)QDataStream的文件格式与Qt版本相关
(5)数据格式文件在程序间传递时,需要考虑版本问题
流使用实用技巧
最近在搞个小项目,用QT结合OpenCV做开发,需要用到将程序运行的某些参数保存下来,采用的是文本保存,这一次遇到的都是一些浮点的类型,一开始想让这些浮点类型转换为字符类型QString,这样的方法也可以行得通,但是会损失一小些精度,且操作繁琐,效率也不高,想到了文本流好像直接支持类型的操作,一开始尝试了下,但是达不到我想要的理想,需要做另外一些的字符分割操作。反反复复对文件进行了操作,不断的调试,最后了解到了文件流操作的规律。
起初的代码:
保存数据到文本文件中。
#define SAVE_DATA "J_SAVE.dat"double XX_Angle;CvPoint2D32f OffsetPos;void MainWindow::saveData(){ QFile ExpandData(SAVE_DATA); if(ExpandData.open(QIODevice::WriteOnly)) { /*文本输出流,用于保存数据*/ QTextStream Out(&ExpandData); Out << XX_Angle; Out << OffsetPos.x; Out << OffsetPos.y; ExpandData.close(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
从文本文件上加载之前保存的数据
#define SAVE_DATA "J_SAVE.dat"double XX_Angle;CvPoint2D32f OffsetPos;void MainWindow::loadData(){ QFile ExpandData(SAVE_DATA); if(ExpandData.open(QIODevice::ReadOnly)) { /*文本输出流,用于保存数据*/ QTextStream In(&ExpandData); In >> XX_Angle; In >> OffsetPos.x; In >> OffsetPos.y; ExpandData.close(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
上面的代码测试的结果是:写和读不对称,写入的东西以同样形式,数据类型对称的形式来读取不能实现对称。最后找到原因是文本文件流一次流读取是以一个空格为结束的,找到这个规律之后,我在写入的数据的时候做了一些额外操作,添加空格。
下面是调通之后的代码,可以尽情享用C++ 流带来的方便快速。
#define SAVE_DATA "J_SAVE.dat"double XX_Angle;CvPoint2D32f OffsetPos;/*实现保存程序运行的数据*/void MainWindow::saveData(){ QFile ExpandData(SAVE_DATA); if(ExpandData.open(QIODevice::WriteOnly)) { /*文本输出流,用于保存数据*/ QTextStream Out(&ExpandData); /*加入空格的好处是以流的形式读取恰好是相反的操作,这样一来方便快速对参数的读取*/ Out << XX_Angle; Out << ' '; Out << OffsetPos.x; Out << ' '; Out << OffsetPos.y;
ExpandData<span class="hljs-preprocessor">.close</span>()<span class="hljs-comment">;</span>}
}
/加载程序运行时保存的数据/
void MainWindow::loadData()
{
QFile ExpandData(SAVE_DATA);
if(ExpandData.open(QIODevice::ReadOnly))
{
/文本输出流,用于保存数据/
QTextStream In(&ExpandData);
<span class="hljs-keyword">In</span> >> XX_Angle<span class="hljs-comment">;</span> <span class="hljs-keyword">In</span> >> OffsetPos<span class="hljs-preprocessor">.x</span><span class="hljs-comment">;</span> <span class="hljs-keyword">In</span> >> OffsetPos<span class="hljs-preprocessor">.y</span><span class="hljs-comment">;</span> ExpandData<span class="hljs-preprocessor">.close</span>()<span class="hljs-comment">;</span>}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- QT实现对数据文本保存的办法及其操作
- QT实现对数据文本保存的办法及其操作
- Qt实现数据文本保存TXT文件
- Qt 对QTextEdit的文本编辑器进行查找操作
- 集及其实现类、“键-值”对型的集合、枚举器与数据操作
- QT实现对sqlite数据库的操作
- QT实现对文件的操作
- JDBC学习之路-对大文本数据的操作
- 关闭窗口时保存数据的办法
- 关闭窗口时保存数据的办法
- jpa保存数据过慢的处理办法
- PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法
- php实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法
- php实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法。
- C++对文本的操作
- 程序对文本的操作
- OC对文本的操作
- Qt 实现的文本编辑器
- 盈利与营销部分
- 实现对称矩阵以及压缩存储
- tensorflow函数解析: tf.Session() 和tf.InteractiveSession()
- React Native获得View相对于屏幕的坐标x,y
- 欢迎使用CSDN-markdown编辑器
- QT实现对数据文本保存的办法及其操作
- JAVA实现DES的ECB/CBC的加密算法
- (转)Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接)
- SQL查询
- ES HDFS快照坑之could not read repository data from index blob
- SpringMVC集合类型参数绑定
- 机器学习基石2-2 PLA(Perceptron Learning Algorithm)
- 【2017.04.20】滴滴一面二面面经
- MS第二题解题思路