2016-02-27 8 views
8

Sto aprendo un file HDF5 esistente per l'aggiunta di dati; Voglio assicurare che il gruppo chiamato /A esista per l'accesso successivo. Sto cercando un modo semplice per creare /A condizionatamente (creare e restituire nuovo gruppo se non esistente o restituire il gruppo esistente). Un modo è quello di verificare l'esistenza di /A. Come posso farlo in modo efficiente?Esistenza del gruppo di test in hdf5/C++

Secondo la documentazione API, posso fare qualcosa di simile:

H5::H5File h5file(filename,H5F_ACC_RDWR); 
H5::H5Group grp; 
try{ 
    grp=h5file.openGroup("A"); 
} catch(H5::Exception& e){ 
    /* group does not exists, create it */ 
    grp=h5file.createGroup("A"); 
} 

ma la bruttezza evidente deriva dal fatto che un'eccezione viene utilizzato per comunicare informazioni che non è eccezionale a tutti.

C'è H5::CommonFG::getObjinfo, che sembra avvolgere H5Gget_objinfo in modo tale che il valore di ritorno falso (inesistente) della routine C genera un'eccezione; quindi ancora lo stesso problema.

È pulito ricorrere all'API C in questo caso, oppure esiste qualche funzione direttamente progettata per testare l'esistenza nell'API C++ che sto trascurando?

+0

Sembra che il C++ equivalente di [ 'H5Lexists'] (https://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Exists) non esiste affatto. Il 'try ... catch ...' sembra molto più pitone di C++ per me, ma penso che o usando l'API C sono le tue due opzioni. – Yossarian

risposta

1

sto testando l'esistenza di un gruppo con:

bool H5Location::attrExists(const char* name) const; 

In questo modo è possibile verificare l'esistenza di gruppo/set di dati/... nella posizione specificata.

// Test if empty (= new) H5 file 
auto isNewFile = this->attrExists(VariablesH5GroupName); 
+0

Non 100% di quello che mi serviva (devo ancora verificare se si tratta di un gruppo e non di un altro attributo) ma sembra il migliore possibile. Grazie! – eudoxos

+1

In realtà funziona solo se il gruppo ha un attributo con nome e questo non è sempre il caso ... Quindi non è una risposta corretta, mi dispiace: / – Salamandar