2016-02-27 7 views
8

Ich öffne eine vorhandene HDF5-Datei zum Anhängen von Daten; Ich möchte sicherstellen, dass die Gruppe /A für den nachfolgenden Zugriff existiert. Ich bin auf der Suche nach einer einfachen Möglichkeit, entweder /A bedingt zu erstellen (erstellen und neue Gruppe zurückgeben, wenn nicht vorhanden, oder die vorhandene Gruppe zurückgeben). Eine Möglichkeit besteht darin, auf /A Existenz zu testen. Wie kann ich es effizient machen?Testgruppenexistenz in hdf5/C++

Nach der API-Dokumentation, ich kann etwas tun:

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"); 
} 

aber die offensichtliche Hässlichkeit kommt von der Tatsache, dass Ausnahmeinformationen zu kommunizieren, verwendet werden, die überhaupt nicht außergewöhnlich ist.

Es gibt H5::CommonFG::getObjinfo, die H5Gget_objinfo in der Weise zu wickeln scheint, dass falscher (nicht vorhandener) Rückgabewert der C-Routine eine Ausnahme auslöst; Also nochmal das selbe Problem.

Ist es in diesem Fall clean, auf die C-API zurückzugreifen, oder gibt es eine Funktion, die direkt dazu dient, die Existenz in der C++ API zu testen, die ich übersehen habe?

+0

Es sieht aus wie die C++ Äquivalent [ 'H5Lexists'] (https://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Exists) gar nicht existieren. Das 'try ... catch ...' scheint mir viel pythischer als C++ zu sein, aber ich denke, dass oder die Verwendung der C API sind Ihre zwei Möglichkeiten. – Yossarian

Antwort

1

Ich teste die Existenz einer Gruppe mit:

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

diese Weise können Sie die Existenz der Gruppe/Datensatz testen/... an der angegebenen Stelle.

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

Nicht 100%, was ich brauchte (ich muss immer noch überprüfen, ob es eine Gruppe und kein anderes Attribut ist), aber es scheint so gut wie es nur geht. Vielen Dank! – eudoxos

+1

Eigentlich funktioniert das nur, wenn die Gruppe ein benanntes Attribut hat und das ist nicht immer der Fall ... Also ist es keine richtige Antwort, sorry: / – Salamandar