简介
直接用c的代码写呢太麻烦,用官网的c++用例写呢还乱码,逼得我只能自己写个类来处理了,要不写的东西太多,c的太繁琐,所以自己封装个类方便调用。
hdf5 封装c++ 类
- #ifndef _OPEN_HDF5_
- #define _OPEN_HDF5_
-
- #include <iostream>
- #include <string>
- #include <vector>
- #include <typeinfo>
- #include "h5Cpp.h"
-
- using namespace std;
-
- struct H5TITLE{
- string name;
- string type;
- };
-
- /******** ATTR ********/
- class CRattr
- {
- private:
- hid_t hand_id;
- public:
- CRattr(hid_t id){
- hand_id = id;
- };
- ~CRattr(){};
- template <class T>
- shared_ptr<CRattr> attr(string key, T value, int len=1){
- hid_t attr_type, attr_space;
- hsize_t attr_dims[1] = { len };
- char* value2 = new char(len);
- if(typeid(T) == typeid(string) || typeid(T) == typeid(char*)){
- attr_type = H5Tcopy(H5T_C_S1);
- H5Tset_size(attr_type, H5T_VARIABLE);
- }else if(typeid(T) == typeid(int)){
- attr_type = H5T_NATIVE_INT;
- }else if(typeid(T) == typeid(double)){
- attr_type = H5T_NATIVE_DOUBLE;
- }else{
- return NULL;
- }
- attr_space = H5Screate_simple(1, attr_dims, NULL);
- hid_t attr = H5Acreate(hand_id, key.c_str(), attr_type, attr_space, H5P_DEFAULT, H5P_DEFAULT);
- if(typeid(T) == typeid(string) || typeid(T) == typeid(char*)){
- H5Awrite(attr, attr_type, value2);
- }else{
- H5Awrite(attr, attr_type, value);
- }
- shared_ptr<CRattr> tmp = make_shared<CRattr>(hand_id);
- return tmp;
- }
- };
-
- /******** DATA ********/
- class CRdata
- {
- private:
- hid_t hand_id;
- string dataset_name;
- public:
- CRdata(hid_t id, string name){
- hand_id = id;
- dataset_name = name;
- };
- ~CRdata(){};
- template <class T>
- shared_ptr<CRattr> insert(int len, T* wdata, vector<H5TITLE> &title){
- herr_t status;
- hsize_t dims[1] = { len };
- hid_t memtype, space, dset, strtype = H5Tcopy(H5T_C_S1);
- status = H5Tset_size(strtype, H5T_VARIABLE);
- status = H5Tset_cset(strtype, H5T_CSET_UTF8);
- memtype = H5Tcreate(H5T_COMPOUND, sizeof(T));
- int sizet = 0;
- for (int i = 0; i < title.size(); i++)
- {
- if (title.at(i).type == "string" || title.at(i).type == "char") {
- H5Tinsert(memtype, title.at(i).name.c_str(), sizet, strtype);
- } else if (title.at(i).type == "double") {
- H5Tinsert(memtype, title.at(i).name.c_str(), sizet, H5T_NATIVE_DOUBLE);
- } else if (title.at(i).type == "int") {
- H5Tinsert(memtype, title.at(i).name.c_str(), sizet, H5T_NATIVE_INT);
- }
- sizet += sizeof(char*);
- }
- space = H5Screate_simple(1, dims, NULL);
- // 创建数据集
- dset = H5Dcreate(hand_id, dataset_name.c_str(), memtype, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- // 插入数据
- status = H5Dwrite(dset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
-
- shared_ptr<CRattr> tmp = make_shared<CRattr>(dset);
- return tmp;
- };
- template <class T>
- shared_ptr<CRattr> insertList(int rows, int cols, T* wdata){
- hid_t space, dset;
- hid_t memtype;
- if (typeid(T) == typeid(double)) {
- memtype = H5T_NATIVE_DOUBLE;
- } else if (typeid(T) == typeid(long double)){
- memtype = H5T_NATIVE_LDOUBLE;
- } else {
- memtype = H5T_NATIVE_INT;
- }
-
- hsize_t dims[] = { rows, cols };
- space = H5Screate_simple(2, dims, NULL);
- // 创建数据集
- dset = H5Dcreate(hand_id, dataset_name.c_str(), memtype, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- // 插入数据
- herr_t status = H5Dwrite(dset, memtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
- shared_ptr<CRattr> tmp = make_shared<CRattr>(dset);
- return tmp;
- };
- };
-
- /******** GROUP ********/
- class CRgroup
- {
- private:
- hid_t hand_id;
- public:
- CRgroup(hid_t id){
- hand_id = id;
- };
- ~CRgroup(){};
- shared_ptr<CRgroup> gopen(string group_name){
- hid_t group_id = H5Gcreate(hand_id, group_name.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- shared_ptr<CRgroup> tmp = make_shared<CRgroup>(group_id);
- return tmp;
- };
- shared_ptr<CRdata> dataset(string dataset_name){
- shared_ptr<CRdata> tmp = make_shared<CRdata>(hand_id, dataset_name);
- return tmp;
- };
- template <class T>
- shared_ptr<CRattr> attr(string key, T* value, int len = 1){
- shared_ptr<CRattr> tmp = make_shared<CRattr>(hand_id);
- tmp->attr<T>(key, value, len);
- return tmp;
- }
- };
-
- /******** FILE ********/
- class CRfile
- {
- private:
- hid_t hand_id;
- public:
- CRfile(string file_name){
- hand_id = H5Fcreate(file_name.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
- };
- ~CRfile(){};
- shared_ptr<CRgroup> gopen(string group_name){
- shared_ptr<CRgroup> tmp = make_shared<CRgroup>(hand_id);
- return tmp.gopen(group_name);
- };
- shared_ptr<CRdata> dataset(string dataset_name){
- shared_ptr<CRdata> tmp = make_shared<CRdata>(hand_id, dataset_name);
- return tmp;
- };
- hid_t getHand() {
- return hand_id;
- }
- };
-
- #endif
封装的使用示例
- struct mtx{
- double x;
- double y;
- string z;
- };
- struct mt{
- double x;
- double y;
- char* z;
- };
-
- struct mtx mtt1[5];
- for (int i = 0; i < 5; i++)
- {
- mtt1[i].x = i;
- mtt1[i].y = i;
- mtt1[i].z = "test";
- }
-
- struct mt mtt2[5];
- for (int i = 0; i < 5; i++)
- {
- mtt2[i].x = mtt1[i].x;
- mtt2[i].y = mtt1[i].y;
- mtt2[i].z = (char*)mtt1[i].z.c_str();
- }
-
- double wdata[4] = {1,2,3,4};
- Rfile test("test.h5");
-
- struct mt *wdata2 = new struct mt[5];
- vector<H5TITLE> title = {{"X","double"},{"Y","double"},{"Z","char"}};
- for (int i = 0; i < 5; i++)
- {
- wdata2[i].x = mtt1[i].x;
- wdata2[i].y = mtt1[i].y;
- wdata2[i].z = (char*)mtt1[i].z.c_str();
- }
-
- test.gopen("gtest").gopen("gtest2").dataset("dset").insertList<double>(2,2,wdata);
- int value[1] = {1};
- test.dataset("dtest").insert<mt>(5, wdata2, title).attr<int>("Name", value, 1);
- test.gopen("att").attr<int>("test", value, 1).attr<int>("test2", value, 1);