c – HDF5:使用字符串创建数据集
发布时间:2020-12-16 07:02:31 所属栏目:百科 来源:网络整理
导读:我正在使用HDF5 API,我正在尝试使用可变长度字符串创建数据集. 结构是 struct dataX{ std::string data;}; 我使用char [256]和静态硬编码大小. 但我希望它是动态的,所以在阅读HDF5文档之后,我发现了H5T_VARIABLE并使用它如下,但它仍然失败. H5Dcreate返回负
我正在使用HDF5 API,我正在尝试使用可变长度字符串创建数据集.
结构是 struct dataX { std::string data; }; 我使用char [256]和静态硬编码大小. H5Dcreate返回负值(表示错误). hid_t mem_type; mem_type = H5Tcopy( H5T_C_S1 ); H5Tset_size(mem_type,H5T_VARIABLE); /* Create the memory data type. */ if ((mem_type_id = H5Tcreate (H5T_COMPOUND,mem_type )) < 0 ) { return -1; } /* Insert fields. */ if ( H5Tinsert(mem_type_id,"field",mem_type_id ) < 0 ) { return -1; } /* Create a simple data space with unlimited size */ // hsize_t dims[1]={0}; // hsize_t maxdimsk[1]={ H5S_UNLIMITED }; if ( (sid = H5Screate_simple( 1,dims,maxdims )) < 0 ){ return -1; } /* Modify dataset creation properties,i.e. enable chunking */ plist_id = H5Pcreate (H5P_DATASET_CREATE); //chunk==1 if ( H5Pset_chunk ( plist_id,1,chunk ) < 0 ){ return -1; } H5Pset_alloc_time( plist_id,H5D_ALLOC_TIME_EARLY ) /* Set the fill value using a struct as the data type. */ // fill_data=0 if ( fill_data ) { if ( H5Pset_fill_value( plist_id,mem_type_id,fill_data ) < 0 ){ LOG_ERROR << "cannot fill value " << LOG_ENDL; return -1; } } else { if ( H5Pset_fill_time( plist_id,H5D_FILL_TIME_NEVER ) < 0 ) { LOG_ERROR << "error" << LOG_ENDL; } } /* Create the dataset. */ did = H5Dcreate( loc_id,dset_name,sid,plist_id ) 我尝试了H5D_ALLOC_TIME_LATE,认为如果它在写入之前分配了内存它可以工作但是……它没有. 现在我被困住了,我不知道该怎么做. 我错过了什么 ? 解决方法
你的mem_type_id双重无效:
> H5Tcreate的第二个参数应该是复合数据类型的大小 我对你正在做的事情一无所知,但是要编写可变长度字符串,你不需要创建一个复合类型,也不需要设置任何特殊的属性列表.基本上你的第3行足以创建一个有效的可变长度字符串数据类型(mem_type).然后创建简单数据空间,然后创建数据集. 看看this example,你会发现它非常简单. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |