- 浏览: 3444110 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
关键问题在于:QFile读取double型二进制数据流,只有两种方法处理数值。
一是通过QDataStream一个一个double读取,存储在一个QVector<double>中
二是通过QFile read(int len) 返回在一个QByteArray中,然后对这个QByteArray进行QDataStream序列化读取。
问题就出现在这个序列化读取中,这种需要循环读取值,耗费了大量时间。
不如C语言的一句size_t fread( void* buffer, size_t size, size_t count, FILE* stream );能迅速的读取进入一个Double[]数组中,时间消耗差距是几十倍。
可以细看下面两类代码,看看他们的时间消耗。
/** *函数介绍:读取裸数据文件 *输入参数:无 *返回值: 无 */ void RawData::readNakedDataFile() { QList< QVector<float> * > dataList; QList< float * > listList; QTime t; double duration; FILE *stream; QFile file("NakedData/nakedData.raw"); if (!file.open(QIODevice::ReadOnly)) return; QDataStream in(&file); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); in.setFloatingPointPrecision(QDataStream::SinglePrecision); float m = 0; t.start(); qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zz"); for(int i = 0;i < 2; i++) { QVector<float> *data = new QVector<float>(); for(int j = 0; j <1152*16; j++) { in >> m ; data->append(m); //qDebug() <<"输出:"<< m << "" << j; } dataList.append(data); } duration = t.elapsed(); qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zz"); qDebug() << "时间" <<duration; file.close(); ////***********C fread 读取成功************// //float list[16*1152]; if( fopen_s( &stream, "NakedData/nakedData.raw", "r+b" ) !=NULL ) return; t.restart(); qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zz"); for(int i = 0; i < 2; i ++) { float * list = new float[1152*16]; fread( list, sizeof(float), 1152*16, stream ); //for(int i = 0; i < 16*1152;i++) //qDebug() << list[i] << "" << i; listList.append(list); } qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zz"); duration = t.elapsed() ; qDebug() << "时间" <<duration; fclose(stream); //打印两种读取结果,判断是否一致 //for(int i = 0; i < 2; i ++) //{ // QVector<float> *dataVector = dataList.at(i); // float * list = listList.at(i); // for(int j = 0; j < 1152*16; j++) // { // qDebug() <<"data:["<<i<<"]["<< j <<"]"<<dataVector->at(j) ; // qDebug() <<"list:["<<i<<"]["<< j <<"]"<< *(list++) ; // } //} }
当循环中的i为2圈的时候,消耗时间分别为 ms
当循环中的i为10圈的时候,消耗时间分别为 ms
当循环中的i为100圈的时候,消耗时间分别为 ms
当循环中的i为1000圈的时候,消耗时间分别为 ms
=============下面调整一下Qt读取文件的方法====================
/** *函数介绍:读取裸数据文件 *输入参数:无 *返回值: 无 */ void RawData::readNakedDataFile() { QList< QVector<float> * > dataList; QList< float * > listList; QTime t; double duration; FILE *stream; QFile file("NakedData/nakedData.raw"); if (!file.open(QIODevice::ReadOnly)) return; float m = 0; t.start(); qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zzz"); for(int i = 0;i < 4; i++) { QByteArray array = file.read(1152*16*4); QDataStream in(&array,QIODevice::ReadOnly); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); in.setFloatingPointPrecision(QDataStream::SinglePrecision); QVector<float> *data = new QVector<float>(); for(int j = 0; j <1152*16; j++) { in >> m ; data->append(m); } dataList.append(data); } duration = t.elapsed(); qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zzz"); qDebug() << "时间" <<duration; file.close(); ////***********C fread 读取成功************// //float list[16*1152]; if( fopen_s( &stream, "NakedData/nakedData.raw", "r+b" ) !=NULL ) return; t.restart(); qDebug() << "时间1:" <<t.currentTime().toString("hh:mm:ss.zzz"); for(int i = 0; i < 4; i ++) { float * list = new float[1152*16]; fread( list, sizeof(float), 1152*16, stream ); listList.append(list); } qDebug() << "时间2:" <<t.currentTime().toString("hh:mm:ss.zzz"); duration = t.elapsed() ; qDebug() << "时间" <<duration; fclose(stream); for(int i = 0; i < 4; i ++) { QVector<float> *dataVector = dataList.at(i); float * list = listList.at(i); for(int j = 0; j < 1152*16; j++) { qDebug() <<"data:["<<i<<"]["<< j <<"]"<<dataVector->at(j) ; qDebug() <<"list:["<<i<<"]["<< j <<"]"<< *(list++) ; } } }
当循环中的i为0圈的时候,消耗时间分别为 ms
当循环中的i为10圈的时候,消耗时间分别为 ms
当循环中的i为100圈的时候,消耗时间分别为 ms
当循环中的i为1000圈的时候,消耗时间分别为 ms
发表评论
-
Qt官网变更【2012】
2012-09-21 19:30 4213Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力 ... -
【转】QT实现不规则窗体
2012-09-21 18:50 4988看到好文章,收藏一下: 看到网上有很多不规则窗体的实现 ... -
Qt应用程序如何使用DCMTK类库进行二次开发DICOM数据传输
2012-09-13 09:35 0参考文章: 1、Using DCMTK with ... -
【转】将QT开发的界面程序封装成DLL,在VC中成功调用
2012-09-11 10:33 21118最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后 ... -
诺基亚挥别Qt,转手给Digia
2012-09-11 09:37 2858一家总部位于芬兰的IT业务供应商Digia今天宣布,已经签署了 ... -
Qt多线程间信号槽传递非QObject类型对象的参数
2012-09-07 15:29 21371一、以前就发现过这个问题: 在Qt项目中,有时候为了 ... -
QT样式表(QStyleSheet)
2012-08-17 10:37 17890QT样式表 (QStyleSheet) 作者:刘旭晖 ... -
FinalData磁盘文件恢复工具(绿色破解版)
2012-08-02 13:28 8582FinalData磁盘文件恢复工具(绿色破解版),使用起来很方 ... -
Eclipse Qt开发环境的建立【转】
2012-08-01 11:15 43741.下载Eclipse目前Eclipse+CDT已经可以 ... -
汽车辐射监测系统-Qt开发
2012-07-25 16:18 4693最近晚上抽空忙了两个月,才把一个小系统做完。虽然做的不是太完 ... -
Qt做发布版,解决声音和图片、中文字体乱码问题
2012-07-14 16:02 4863Qt做发布版,解决声音和图片、中文字体乱码问题 ... -
QTableView使用中的疑问,如何及时显示操作Model后的结果?
2012-06-01 14:52 0最终的解决方法:我正 ... -
【转】Qt QTableview使用
2012-06-01 09:49 9674QTableWidget是QT程序中常用的显示数 ... -
QTableView双击 单机事件信号
2012-06-01 09:47 23087双击QTableView的行,获取该行数据 代码 ... -
QMessageBox改变大小
2012-05-31 15:33 8440创建一个QMessageBox: QMessageBo ... -
更新QTableView中的进度条状态
2012-05-30 14:37 14855前段时间,我接触了,如何在一个QTableView中加入一个控 ... -
QThread 线程暂停 停止功能的实现
2012-05-29 11:56 12199为了实现Qt中线程的暂停运行,和停止运行的控制功能 需要在设 ... -
QT环境变量
2012-05-28 18:53 5593不知道为啥同事有台电脑,装完Qt-VS2008库,和VS Ad ... -
广告光
2012-05-24 18:33 0盈创广告联盟 http://www.yo114.cn/ ... -
Test
2012-05-24 18:22 2186Test<IMG SRC="cf08e32c2 ...
相关推荐
总的来说,通过使用QT的`QFile`和`QByteArray`,我们可以方便地读取和显示文件的二进制内容,这对于理解和处理二进制数据至关重要。这个过程涉及到文件I/O操作、数据类型转换以及字符串处理,是QT开发中的常见技能。
在IT领域,特别是软件开发中,Qt是一个非常流行的开源跨平台应用...通过结合`QFile`和`QDataStream`,开发者能够轻松地读取和解析各种格式的数据文件。对于新手而言,理解这些基本概念和API是进入Qt开发的重要一步。
5. **读取和写入二进制数据**:使用QIODevice的read()和write()函数,我们可以将图像数据从内存中的QImage对象读取出来,或者将二进制数据写入到文件中。这两个函数都接受一个uchar(无符号字符)指针和一个大小参数...
在Qt库中,QFile是一个核心的类,用于处理本地文件。这个压缩包"Qt QFile读取文件列数据....实际应用中,根据具体的数据格式和需求,可能需要扩展这些基础方法,例如,添加对其他分隔符的支持,或者处理二进制文件等。
在Qt框架中,QFile类是用于处理本地文件的基础组件,它可以用来读取、写入和操作文件。本文将深入探讨如何使用QFile配合其他工具类来读取、修改和删除ini配置文件中的数据,以替代QSettings在某些场景下的不便。 ...
在处理二进制文件时,我们通常需要高效地读取和写入大量数据,例如图像、音频或自定义格式的数据结构。 首先,让我们看看在Qt中进行二进制文件读写的API。Qt提供了`QFile`类来处理文件操作,包括读取和写入。对于二...
2. **二进制文件操作**:在QT中,可以使用QFile类来处理文件,包括读取和写入二进制文件。QFile::open()函数用于打开文件,然后QFile::read()可以用来读取二进制数据,这些数据通常会被转换成QByteArray对象,以便...
2. **二进制文件操作**:在QT中,可以使用QFile类来处理文件,包括二进制文件。QFile::open()函数用于打开文件,传入QIODevice::ReadOnly或QIODevice::WriteOnly标志以指定读写模式。读取二进制文件时,可以使用...
文本文件主要包含人类可读的文字信息,而**二进制文件**则是指除文本文件之外的其他类型文件,它们通常包含特定格式的数据,比如图像、音频、视频等多媒体文件,以及特定应用的数据文件。 二进制文件中的数据是以...
在QT编程中,QFile和QFileInfo是两个非常重要的类,它们主要用于文件的读取和文件信息的获取。本文将详细讲解这两个类的功能、用法以及如何在实际开发中应用。 首先,QFile是QT库中的一个核心组件,用于处理本地...
本文将深入探讨如何使用Qt的QDataStream类来实现二进制文件的读写操作,并结合自定义数据结构`AccountInfo`进行演示。 首先,二进制文件相比于文本文件具有诸多优势。它们占用的磁盘空间更小,因为二进制文件不包含...
在QT编程环境中,读取二进制文件是一项常见的任务,特别是在处理图像、音频或自定义数据格式时。本文将深入探讨如何使用QT框架来实现这一功能,并特别关注如何使程序支持用户通过拖放操作来加载文件。 首先,我们...
HEX文件操作涉及到对这类文件的读取、写入和解析等基本功能。下面将详细讨论QT如何实现HEX文件操作,并结合提供的资源,如《HEX文件格式解析.pdf》和源码工程,探讨相关知识点。 首先,了解HEX文件格式至关重要。...
在软件开发过程中,二进制(bin)文件是一种常见的数据存储格式,它能够高效地存储各种类型的数据,包括但不限于文本、图像、音频等。Qt作为一款跨平台的应用程序开发框架,提供了强大的工具集来处理这类文件。 ###...
Qt使用QFile和QDataStream进行二进制数据文件的读写。QFile负责文件的IO设备接口,即与文件的物理交互,QDataStream以数据流的方式读取文件内容或写入文件内容。 本节以实例samp7_2演示二进制文件的读写.
1. **数据读取**:首先,程序会使用Qt的QFile或QTextStream类读取Excel文件。Qt没有内置的Excel文件处理功能,但可以借助外部库如QAxObject(ActiveQt)或者更现代的QCustomOrm等来与Excel交互。 2. **数据解析**:...
文件读取操作 文件读取同样涉及到几个关键步骤: - **创建文件对象**:与写入类似,使用`QFile`类创建一个文件对象。 - **打开文件**:这次是采用只读模式`QIODevice::ReadOnly`和文本模式`QIODevice::Text`。 - **...
在Qt框架中,QFile和QChart是两个重要的模块,分别用于文件操作和图表绘制。本教程将深入探讨如何利用这两个模块从txt文件中读取数据,并将其转换为图形,特别是绘制曲线图。 首先,我们需要了解`QFile`类。它是Qt...
在Qt框架中,进行文件操作是非常常见的任务,包括创建、写入、删除文件以及处理特定格式如INI和XML文件。以下是对这些操作的详细说明: 1. 创建文件夹: 要创建一个新的文件夹,可以使用`QDir`类。首先包含头文件`...