QT输入输出(一) 之 QDataStream 测试
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》中,没有加入这一句,所以会出现数据无法写入文件的问题,当然也无法读到数据。是因为,写操作是把数据写到缓冲区,交给操作系统完成写到文件的任务,但是操作系统是多任务的,不会立即把缓冲区的数据写到文件,所以最好强制把缓冲区的数据写到文件。
QT输入输出(一) 之 QDataStream 测试的更多相关文章
- Qt笔记——QFile,QDataStream,QTextStream
QFile #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } clas ...
- Qt QT的IO流 QT输入输出
1. QFile QDataStream 读写文件 二进制读写文件 #include <QApplication> #include <QtGui> #include < ...
- 让Jayrock插上翅膀(加入输入输出参数注释,测试页面有注释,下拉框可以搜索)
继上一篇文章介绍了Jayrock组件开发接口的具体步骤和优缺点之后,今天给大家带来的就是,如何修复这些缺点. 首先来回顾一下修复的缺点有哪些: 1.每个接口的只能写大概的注释,不能分开来写,如接口的主 ...
- 【QT】二进制读取图像文件测试
QDataStream in(&file); int n; in >> n ; file.close(); qDebug() << n<<"en& ...
- 【转】从QDataStream向QByteArray中写入数据时的注意点(QT)
最近发现从QDataStream向QByteArray中写入数据常常是写不进去的,通过查看QT的源码: QDataStream &operator>>(QDataStream &a ...
- QT程序库
实际上,QT不仅仅是一个巨大的程序库,而是7个程序库,还包括许多使用工具,qmake是其中的一个.如今,术语GUI工具包代表的东西的用途不再仅仅是系统提供的那么一个小部分(GUI界面).尤其是QT ...
- web测试一般分为那几个阶段,哪些阶段是可以用工具实现的,都有些什么工具,哪些阶段必须要人工手动来实现呢?
这是我在知乎上遇到的一个问题: web测试一般分为那几个阶段,哪些阶段是可以用工具实现的,都有些什么工具,哪些阶段必须要人工手动来实现呢? 首先这个提问本身就是有问题的, 没有哪个阶段是用工具实现的, ...
- QT5.4关联VS2010,配置VAssistX关联Qt类
1.参考网站:http://www.kavenblog.com/?p=272 2.下载插件:http://www.qt.io/zh-hans/download-open-source/#section ...
- 《Qt 实战一二三》
简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...
随机推荐
- php数组排序函数
下边提到的几个数组函数的排序有一些共性: 1 数组被作为排序函数的参数,排序以后,数组本身就发生了改变,函数的返回值为bool类型.2 函数名中出现单a表示association,含义为,在按值排序的 ...
- mysql装载本地文件及模式匹配
使用load data装载本地文件到表中,文件每行一条记录,列值之间用tab分隔,并按照次序一一列出,对于无值或丢失的情况可以使用\N.但是在使用insert into插入的时候不能使用\N,而应该是 ...
- SQLServer的最大连接数 超时时间已到 但是尚未从池中获取连接
很多做架构设计.程序开发.运维.技术管理的朋友可能或多或少有这样的困惑: SQLServer到底支持多少连接数的并发? SQLServer是否可以满足现有的应用吗? 现有的技术架构支持多少连接数的并发 ...
- 【C#学习笔记】从粘贴板复制文本
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 如何脱离SDK,使用DW5.5和phonegap以及JQMobile搭建开发环境
也许有些人是学C++出身,对于Java几乎不了解.一时心血来潮想学学android开发,于是下载了Eclipse,安装了SDK,有模有样的学习起来.也许是懒惰了,对于java一直总是提不起精神.于是确 ...
- 服务器 libevent中epoll使用实例demo
名词解释:man epoll之后,得到如下结果: NAME epoll - I/O event notification facility SYNOPSIS #include ...
- Linux下常用软件
一, vmtool安装, 进入桌面就后,如果没有看到VMware Tools光盘, 请点击VMware Station菜单栏上的“虚拟机”,然后选择“安装VMware Tools”,就可以在桌面上以看 ...
- WebAPI初探
由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...
- 匿名函数自执行原理和instanceof运算符执行原理
今天收到RSS订阅中有一篇<Javascript – Arraylike的7种实现>,看第一种实现方式是,瞬间被!function(){}()这种匿名函数自执行方式给亮瞎了眼睛.这种写法绝 ...
- awk与sed简明教程
看到大牛写的关于awk和sed的简明教程,写得很好,为了尊重作者,就不全文转载了,这里标记下链接,方便以后查阅. awk简明教程:http://coolshell.cn/articles/9070.h ...