Hi Rafal,

You'll need to pass in link_name_size+1 to the final call of H5Lget_name_by_idx 
as well.


BTW, you can use h5dump to see the structure of the file, initially.


Thanks,

Binh-Minh


________________________________
From: Hdf-forum <[email protected]> on behalf of Rafal 
Lichwala <[email protected]>
Sent: Tuesday, March 28, 2017 4:26 AM
To: [email protected]
Subject: [Hdf-forum] HDF5 API problems

Hi,

For the purpose of some project I'd like to read HDF5 files in my C++
application using HDF5 API.

First of all I would like to read entire HDF5 file structure to know
where are the groups (their names, attributes etc.) and where I can find
datasets.
The API functions like H5*iterate (non-recursive version) or H5*visit
(recursive version) are rather useless, because their H5*_info_t
structures have very limited information about the object on the given
level in this structure.
Thus I've decided to walk manually through this structure and get as
much information as I can for the given object.

So...

Calling H5Gget_info gives me a number of links at the top ("." group)
which then I can ask for details based on their index. Fine.
Now, having the link index, I can call H5Lget_name_by_idx to get the
link name.
First initial call to that function will return the name size and second
one will return the link name in the properly prepared buffer of char*.

On that stage I found a first problem (a bug I suppose):
Let's assume the link name is "foobar", so it has 6 characters.
Initial call of H5Lget_name_by_idx returns 6, but when I call it again
with "size" parameter set to 6 it fills my buffer with just 5 characters
("fooba") even if the buffer has a proper size of 7 bytes (the 7th for
the final \0).
So it seems I have to increase size by 1 to get the proper link name.
What's the problem here? Maybe it's just my wrong understanding for this
API function?

Code example (returns "fooba" instead of "foobar" in the "link_name"
buffer):

// initial call to get name size
int link_name_size = H5Lget_name_by_idx(file.getId(), ".",
H5_INDEX_NAME, H5_ITER_NATIVE, i, NULL, 0, 0);

// one more byte for \0 at the end
char *link_name = new char[link_name_size + 1];

// final call
H5Lget_name_by_idx(file.getId(), ".", H5_INDEX_NAME, H5_ITER_NATIVE, i,
link_name, link_name_size, 0);


Can someone please explain me what's the problem here?

Regards,
Rafal


_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5
_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org
Twitter: https://twitter.com/hdf5

Reply via email to