2017-05-30 4 views
0

So habe ich eine hdf5-Datei, die einen Datensatz enthält:Wie H5T_STRING von hdf5 lesen C mit

DATASET "updateDateTime" {DATATYPE H5T_STRING{ 
    STRSIZE 24; 
STRPAD H5T_STR_NULLPAD; 
CSET H5T_CSET_ASCII; 
CTYPE H5T_C_S1; 
} 
    DATASPACE SIMPLE{ (5)/(5) } 
    DATA{ 
    (0) : "2015-05-12\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 
    (1) : "2015-05-13\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 
    (2) : "2015-05-14\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 
    (3) : "2015-05-15\000\000\000\000\000\000\000\000\000\000\000\000\000\000", 
    (4) : "2015-05-16\000\000\000\000\000\000\000\000\000\000\000\000\000\000" 
} 

ich diesen Datensatz mit C lesen will, aber ich kann ein gutes Beispiel nicht finden (ich bin neu zu HDF5). Insbesondere kann ich nicht herausfinden, welches H5T_NATIVE_ * beim Lesen verwendet werden soll. Hier ist der Code, den ich jetzt habe:

hid_t time_ds = H5Dopen(grp, "updateDateTime", H5P_DEFAULT); 
auto time_shape = get_dataset_shape(time_ds); 
char** time_str = (char **)malloc(time_shape[0] * sizeof(char *)); // TODO: memeory allocation correct?? 

status = H5Dread(time_ds, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, 
    time_str); 
/*do my stuff*/ 

free(time_str); 
status = H5Dclose(time_ds); 
+0

Und was passiert, wenn Sie diesen Code ausführen: speichert mehr als eine Zeichenfolge (die oben durch einen Blick auf das Ergebnis der h5dump geschrieben zu sein, Ihr Fall scheint), können Sie diese durch Looping die Ergebnismenge abrufen? – arboreal84

+0

Nun, time_str ist nicht gefüllt mit Daten nach H5Dread() @ arboreal84 –

Antwort

0

Nach dem Graben in den Quellcode von h5dump (das Werkzeug geht mit hdf5 Paket), ich habe es endlich zu arbeiten. Ich kann nicht sagen, dass dies eine gute Lösung ist, aber hoffe, dass dies anderen Menschen helfen kann, die auf ähnliche Probleme stoßen.

Es stellt sich heraus die nativen Typ durch diese Funktion

spekuliert werden kann
hid_t h5tools_get_native_type(hid_t type) 
{ 
hid_t p_type; 
H5T_class_t type_class; 

type_class = H5Tget_class(type); 
if (type_class == H5T_BITFIELD) 
    p_type = H5Tcopy(type); 
else 
    p_type = H5Tget_native_type(type, H5T_DIR_DEFAULT); 

return(p_type); 
} 

Dann lesen, den Datensatz wie folgt aus:

type = H5Dget_type(dset); 
native_type = h5tools_get_native_type(type); 
auto shape = get_dataset_shape(dset); 
n_element = std::accumulate(shape.begin(), shape.end(), 1ull, std::multiplies<size_t>()); 
type_size = std::max(H5Tget_size(type), H5Tget_size(native_type)); 
size_t alloc_size = n_element * type_size; 
char * buf = BAT_NEW char[alloc_size]; 

status = H5Dread(dset, native_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); 

/*do my stuff*/ 

H5Tclose(native_type); 
H5Tclose(type); 
delete[] buf; 
0

Versuchen

char* time_str = (char*) malloc(time_shape[0] * sizeof(char)); 

status = H5Dread(time_ds, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, &time_str); 
+0

Danke, aber das scheint nicht zu funktionieren. time_str ist immer noch leer –

0

Alternativ Sie den Datensatz (vom Datentyp H5T_STRING) lesen konnte mit HDFql in C wie folgt:

Falls der Datensatz

hdfql_execute("SELECT FROM updateDateTime"); 
while(hdfql_cursor_next(NULL) == HDFQL_SUCCESS) 
{ 
    printf("Dataset value is %s\n", hdfql_cursor_get_char(NULL)); 
} 
Verwandte Themen