2011-05-31 4 views
1

J'apprends actuellement l'API HDF5 et j'essaie d'insérer un ensemble de C++ std :: string dans un ensemble de données HDF5 (1 colonne).HDF5: insertion d'un ensemble de chaînes dans un ensemble de données

Dans l'extrait suivant, comment faire pour boucler un vector<string> et insérer chaque chaîne à l'index de droite?

Comment devrais-je dire à HDF5 si je veux utiliser une chaîne de longueur fixe ou une chaîne std :: string de type can-have-any-length?

vector<string> samples; 
(...) 
/* create HDF5 file */ 
hid_t  hdf5file= H5Fcreate(hdf5_filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); 
if(hdf5file==-1) 
    { 
    cerr << "Cannot create HDF5 file "<< hdf5_filename << endl; 
    return(EXIT_FAILURE); 
    } 
/* create a group in this file */ 
hid_t group = H5Gcreate2(hdf5file, "/MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); 
if(group==-1) 
    { 
    cerr << "Cannot create HDF5 group "<< endl; 
    return(EXIT_FAILURE); 
    } 
/* create a dataspace for the samples array of one dimension */ 
hsize_t dim1=samples.size(); 
hid_t dataspace = H5Screate_simple(1, &dim1, NULL); 
if(dataspace==-1) 
    { 
    cerr << "Cannot create HDF5 dataspace "<< endl; 
    return(EXIT_FAILURE); 
    } 
/* create datatype for a string . How shoud I tell if i want a fixed-length string or a can-have-any-length string ?*/ 
hid_t datatype = H5Tcopy(H5T_C_S1); 
if(datatype==-1) 
    { 
    cerr << "Cannot create H5Tset_size "<< endl; 
    return(EXIT_FAILURE); 
    } 
int ret = H5Tset_size (datatype, H5T_VARIABLE); 
if(ret!=0) 
    { 
    cerr << "Cannot create H5Tset_size "<< endl; 
    return(EXIT_FAILURE); 
    } 
hid_t dataset = H5Dcreate2(group, "Samples", datatype, dataspace, 
     H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); 

for(vector<string>::size_type i=0;i< samples.size();++i) 
    { 
    /** here I'm puzzled, how should I insert the value of samples[i].c_str() at 
      the i-th index of the dataset ? */ 
    const char* sampleName= samples[i].c_str() ; 
    ???? 
     ???? 
    ???? 
    } 

/* close data set */ 
H5Dclose(dataset); 
/* close datatype */ 
H5Tclose(datatype); 
/* close the dataspace */ 
H5Sclose(dataspace); 


/* close the group */ 
H5Gclose(group); 

/* close hdf5 file */ 
H5Fclose(hdf5file); 
+0

double possible de [Comment mieux écrire un conteneur std :: vector dans un ensemble de données HDF5?] (http://stackoverflow.com/questions/581209/how-to-best-write-out-a-stdvector-stdstring-container -to-a-hdf5-dataset) – Pierre

Répondre

2

Tout d'abord, faire un tableau de style C de char* avec des pointeurs à vos cordes:

const size_t n = samples.size(); 
char* data[n]; 
for (size_t i = 0; i < n; i++) 
{ 
    data[i] = samples[i].c_str(); 
} 

Ensuite, écrire tout en une seule fois:

H5Dwrite(dataset, datatype, dataspace, H5S_ALL, H5P_DEFAULT, data); 
Questions connexes