How exactly H5Dget_type works

I am new to HDF5 and I don’t understand how the H5Dget_type function works.
I wanted to use it to know what type of data are stored in a dataset. To test I use a H5 file with different data set
one is an array of 32bit float
one is an array of 32bi integer
but when I use the H5Dget_type function to see the type of data I have in my dataset the answer is always the same 0

Can you share a short code example? It is now impossible to answer why you are getting 0.


Sorry I forget to share my code

int main(void)
        file_id = H5Fopen("myfile.h5", H5F_ACC_RDWR, H5P_DEFAULT);
       dataset_id = H5Dopen(file_id, "/DS1/", H5P_DEFAULT);//26x256x320 32bit floating point
	hsize_t taille = H5Dget_storage_size(dataset_id);
	hid_t dt= H5Dget_type(dataset_id);
	printf("size=%i (%i)", taille, dt);
	status = H5Dclose(dataset_id);

	dataset_id = H5Dopen(file_id, "/DS2/", H5P_DEFAULT);///26 64bit floating point
	taille = H5Dget_storage_size(dataset_id);
	dt = H5Dget_type(dataset_id);
	printf("size=%i (%i)", taille, dt);
	status = H5Dclose(dataset_id);
        status = H5Fclose(file_id);

the output for the size is correct but data type is always 0

hid_t dt - this is an identifier that has to be used in other calls.
get the size:
size_t datum_size = H5Tget_size(dt);
get the type class:
H5T_class_t type_class = H5Tget_class(dt);
switch (type_class) {
if (H5Tequal(dt, H5T_STD_I8BE) == true)
else if (H5Tequal(dt, H5T_STD_I8LE) == true)
etc… (see the source for h5tools_print_datatype function in the tools/lib/h5tools_dump.c file)


It is working thanks

Hi @gouyon,

In case you are not bound to a specific library, have a look at HDFql, a high-level declarative programming language to manage HDF5 data. Using HDFql in C, your use-case can easily be solved as follows:

int data_type;

hdfql_execute("SHOW DATA TYPE myfile.h5 DS1");


data_type = hdfql_cursor_get_int(NULL);

if (data_type == HDFQL_INT)
    printf("The dataset is of type integer\n");
else if (data_type == HDFQL_FLOAT)
    printf("The dataset is of type float\n");
else if (data_type == HDFQL_DOUBLE)
    printf("The dataset is of type double\n");

Hope it helps!