c – HDF5:使用字符串创建数据集

我正在使用HDF5 API,我正在尝试使用可变长度字符串创建数据集.
结构是

struct datax
{
  std::string data;
};

我使用char [256]和静态硬编码大小.
但我希望它是动态的,所以在阅读HDF5文档之后,我发现了H5T_VARIABLE并使用它如下,但它仍然失败.

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的第二个参数应该是复合数据类型的大小
>在H5Tinsert中,最后一个参数应该是插入字段的数据类型.在这里,我猜你的意思是mem_type而不是mem_type_id.

我对你正在做的事情一无所知,但是要编写可变长度字符串,你不需要创建一个复合类型,也不需要设置任何特殊的属性列表.基本上你的第3行足以创建一个有效的可变长度字符串数据类型(mem_type).然后创建简单数据空间,然后创建数据集.

看看this example,你会发现它非常简单.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...