Andrei, knowing that the lengths of all the strings in the file
don't exceed 32 doesn't help. The string type in the file is variable
length and not fixed length and the library doesn't do any kind of automatic
conversion for you. The call

H5Tset_size(strType, 32);

is well intended but wrong under the circumstances. It ought to be

H5Tset_size(strType, H5T_VARIABLE);

Have a look at 

http://www.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/
C/H5T/h5ex_t_vlstring.c

Best, G.

-----Original Message-----
From: hdf-forum-boun...@hdfgroup.org [mailto:hdf-forum-boun...@hdfgroup.org]
On Behalf Of Salnikov, Andrei A.
Sent: Thursday, February 02, 2012 2:18 PM
To: HDF Users Discussion List
Subject: [Hdf-forum] Reading variable-length strings into fixed-size char
array

Hi,

I'd like to be able to read variable-length strings from HDF5 file into
fixed-size array but could not find a way to do it. What I have is this
dataset in the file:

            DATASET "eventcodes" {
               DATATYPE  H5T_COMPOUND {
                  H5T_STD_U16LE "code";
                  H5T_STRING {
                     STRSIZE H5T_VARIABLE;
                     STRPAD H5T_STR_NULLTERM;
                     CSET H5T_CSET_ASCII;
                     CTYPE H5T_C_S1;
                  } "desc";
               }

I'd like very much to read this dataset into this in-memory structure:

    struct eventcodes {
        uint16_t code;
        char[32] desc;
    };

I know that all strings in file are shorter than 32 bytes, so this should be
safe to do. When I define this in-memory data type for the structure:

    hid_t tid = H5Tcreate ( H5T_COMPOUND, sizeof(eventcodes) ) ;
    H5Tinsert(tid, "code", 0, H5T_NATIVE_UINT16);
    hid_t strType = H5Tcopy(H5T_C_S1);
    H5Tset_size(strType, 32);
    H5Tinsert(tid, "desc", 2, strType);

and try to read dataset with it I get errors from HDF5 about conversion
problem:

  #000: H5Dio.c line 174 in H5Dread(): can't read data
    major: Dataset
    minor: Read failed
  #001: H5Dio.c line 337 in H5D_read(): unable to set up type info
    major: Dataset
    minor: Unable to initialize object
  #002: H5Dio.c line 836 in H5D_typeinfo_init(): unable to convert between
src and dest datatype
    major: Dataset
    minor: Feature is unsupported
  #003: H5T.c line 4449 in H5T_path_find(): no appropriate function for
conversion path
    major: Datatype
    minor: Unable to initialize object

I thought that this kind of conversion would be pretty straightforward and
easy to implement, but apparently it's not done. Did I do something wrong
here or is my assumption just incorrect?

I'm using 1.8.6 but would be happy to switch to new version if this
conversion is supported in later versions.

Thanks,
Andy





_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org



_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org

Reply via email to