2016-02-27 108 views
8

我正在打開一個用於附加數據的現有HDF5文件;我想確保存在用於後續訪問的名爲/A的組。我正在尋找一種簡單的方法,可以有條件地創建/A(如果不存在,則創建並返回新組,或返回現有組)。一種方法是測試/A的存在。我怎樣纔能有效地做到這一點?hdf5/C++中的測試組存在

根據API文檔,我可以做這樣的事情:

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

但明顯醜陋來自於異常用於溝通這也不例外,在所有信息的事實。

H5::CommonFG::getObjinfo,它似乎包裝H5Gget_objinfo,以便C例程的返回值的假(不存在)拋出異常;所以再次出現同樣的問題。

在這種情況下,求助於C API還是很乾淨,還是有一些函數直接設計用於測試我忽略的C++ API中的存在?/......在指定位置這樣,你可以測試組/數據集的存在

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

+0

它看起來像C++當量的['H5Lexists'](https://www.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Exists)不存在的。 'try ... catch ...'似乎比C++更加pythonic,但我認爲或者使用C API是你的兩個選擇。 – Yossarian

回答

1

我測試組的存在有。

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

不是100%我需要的東西(我仍然需要檢查它是否是一個組,而不是其他屬性),但看起來像它可以得到的一樣好。謝謝! – eudoxos

+1

其實這隻有當組有一個命名屬性,並不總是這樣...所以這不是一個正確的答案,對不起:/ – Salamandar