QT输入输出(一) 之 QDataStream 测试
2023-09-11 14:20:12 时间
QT提供了两个高级别的流类---QDataStream和QTextStream,可以从任意的输入输出设备读取或写入数据。
QDataStream用于读写二进制数据,它的优点是:在读写数据的时候已经严格定义了数据流的类型和每个类型的长度,这样就不用关心编码之间转换的问题了。
QTextStream用于读写文本(如HTML、XML和源代码等)的格式,解决了二进制文件格式无法直接阅读和编辑的缺点。QTextStream考虑了Unicode编码与系统本地编码或其他编码之间的转换问题,并考虑了不同操作系统之间行尾符切换的问题(MS “\r\n”, Mac “ \n”)。
QTextStream使用16位的QChar类型作为基本数据单元,并支持数字类型和字符串类型的转换。
现在先对QDataStream测试:
(一)先看测试代码
#include <QCoreApplication> #include<QDataStream> #include<QFile> #include<QHash> #include<iostream> #include<QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QHash<int, QString> hash; hash.insert(0, "working"); hash.insert(1, "hard"); hash.insert(2, "!"); QString str("this is a QDataStream test "); QFile file("test.dat"); if(!file.open(QIODevice::WriteOnly)) { std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl; // return; } QDataStream out(&file); out.setVersion(QDataStream::Qt_4_3); out<<quint32(0x12345678)<<str<<hash; if(!file.flush()) { qDebug("write faile"); } QFile file_in("test.dat"); if(!file_in.open(QIODevice::ReadOnly)) { std::cerr<<"can not open file test.dat:"<<qPrintable(file.errorString())<<std::endl; } QDataStream in(&file_in); in.setVersion(QDataStream::Qt_4_3); quint32 c; QHash<int, QString> b; QString str1; in>> c >> str1 >> b; qDebug()<<c <<endl<<str1<<endl; QHash<int, QString>::const_iterator j; for(j = b.constBegin(); j != b.constEnd(); j++) qDebug()<<j.key()<<" "<<j.value()<<endl; return a.exec(); }
(二)测试结果
(三)总结
1、
std::cerr<<"cannotopenfiletest.dat:"<<qPrintable(file.errorString())<<std::endl;
才用标准错误输出,qPrintable()函数将QString转换为C++标准的 const char* 字符串。
也可采用QString.toStdString(),返回C++ string类型。
2、
由于QT中不同版本有不同的QT数据类型的表示方式,所以在输入输出时最好设置统一的版本号(版本号是一个整数),保持存储、接收数据的一致性。
out.setVersion(QDataStream::Qt_4_3);
in.setVersion(QDataStream::Qt_4_3);
3、
QDataStream默认采用大端(big-endian)方式存储32位整数,所以为了在所有平台上确保0x12345678表示的都是32位无符号数,采用了quint的强制类型转换
quint32(0x12345678)
4、
if(!file.flush()) { qDebug("write faile"); }
在《C++ GUI QT 4》中,没有加入这一句,所以会出现数据无法写入文件的问题,当然也无法读到数据。是因为,写操作是把数据写到缓冲区,交给操作系统完成写到文件的任务,但是操作系统是多任务的,不会立即把缓冲区的数据写到文件,所以最好强制把缓冲区的数据写到文件。
相关文章
- STM32MP157开发板Linux+Qt项目实战:音乐播放器
- Qt 自学QGraphicsItem要点 积累
- QT-多线程重要概念及与界面之间交互总结(混淆点分析:c#中可以在子线程中创建ui控件,qt中不能在子线程中创建ui控件)
- Qt 事件处理机制-qt源码解读
- 【QT】Qt 给已经开发好的程序快速封装成动态库
- 【QT】Qt项目demo:数据在ui界面上显示,鼠标双击可弹窗显示具体信息
- 【QT】Qt 中 Json 的操作
- 【QT】Qt creator连接MySQL数据库 - 增删改查
- 【QT】Qt 使用MSVC2017找不到编译器的解决办法
- 《QTP自动化测试权威指南(第二版)》—第1章1.4节开始使用QT
- Qt编写雷达模拟仿真工具(模拟点/歼击机/航母/发射导弹/爆炸效果/激光雷达等)
- Qt编写物联网管理平台41-自动清理早期数据
- Qt音视频开发45-视频传输TCP版
- Qt编写安防视频监控系统9-自动隐藏光标
- Qt里的原子操作QAtomicInteger,有挑战性,使用Q_ATOMIC_INT{nn}_IS_SUPPORTED测试系统是否支持
- QT中|Qt::Tool类型窗口自动退出消息循环问题解决(setQuitOnLastWindowClosed必须设置为false,最后一个窗口不显示的时候,程序会退出消息循环)
- Install Qt 5 on Ubuntu(使用qt-opensource-linux-x64-5.7.0.run进行安装,而且是官方的wiki)
- 查看和调试Qt源码
- Qt之界面换肤
- Qt之图形(简笔画-绘制漂亮的西瓜)
- Qt error:QtThese QT version are inaccessible
- Qt常见bug
- 查看和调试Qt源码(动态编译的QT也可进入源码)good