【问题标题】:HDF5 :Create a Dataset with stringHDF5:使用字符串创建数据集
【发布时间】:2012-11-22 10:05:37
【问题描述】:

我正在使用 HDF5 API,我正在尝试创建一个具有可变长度字符串的数据集。 结构是

struct dataX
{
  std::string data;
};

我使用的是带有静态硬编码大小的 char[256]。
但我希望它是动态的,所以在阅读了 HDF5 Doc 之后,我找到了 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", 0, 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, mem_type_id, sid, plist_id )

我尝试了H5D_ALLOC_TIME_LATE,认为如果它在写入之前分配内存可能会起作用,但是......它没有。

现在我被卡住了,我不知道该怎么办。

我错过了什么吗?

【问题讨论】:

    标签: c++ string hdf5


    【解决方案1】:

    您的mem_type_id 双重无效:

    • H5Tcreate 的第二个参数应该是复合数据类型的大小
    • 在H5Tinsert 中,最后一个参数应该是插入字段的数据类型。我猜你的意思是mem_type 而不是mem_type_id。

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

    看看this example,你会发现它很简单。

    【讨论】:

      猜你喜欢
      • 2013-12-19
      • 2017-11-23
      • 2015-05-18
      • 2014-06-11
      • 2016-06-05
      • 2014-10-26
      • 2011-09-05
      • 2012-11-29
      • 2020-02-29
      相关资源
      最近更新 更多