#c #attributes #hdf5
#c #атрибуты #hdf5
Вопрос:
Я пытаюсь создать приложение на C , которое использует библиотеку HDF5. Для моего использования у меня есть фаза инициализации, на которой я создаю структуру (группы, атрибуты) для файла и присваиваю им значение по умолчанию. Позже я пытаюсь вернуться к атрибутам и изменить их. Моя текущая попытка приведена ниже:
#include <iostream>
#include <cstdint>
#include <string>
#include "H5Cpp.h"
const H5std_string FILE_NAME( "test.h5" );
int main (void)
{
/*
* Create a new file. If file exists its contents will be overwritten.
*/
H5::H5File file(FILE_NAME, H5F_ACC_TRUNC);
/*
* Create Groups and Attributes
*/
H5::Group g_data(file.createGroup( "/Data" ));
H5::DataSpace dspace = H5::DataSpace(H5S_SCALAR);
H5::Attribute version = g_data.createAttribute("version", H5::PredType::NATIVE_INT, dspace);
int curVersion = {1};
version.write(H5::PredType::NATIVE_INT, amp;curVersion);
version.close();
dspace.close();
g_data.close();
// WORK WITH DATASETS
H5::Attribute new_version = file.openAttribute("/Data/version");
int newVersion = {2};
new_version.write(H5::PredType::NATIVE_INT, amp;newVersion);
new_version.close();
file.close();
return 0;
}
Однако я получаю сообщение об ошибке при выполнении этого:
HDF5-DIAG: Error detected in HDF5 (1.10.0-patch1) thread 140574792701760:
#000: ../../../src/H5A.c line 438 in H5Aopen(): unable to load attribute info from object header for attribute: '/Data/version'
major: Attribute
minor: Unable to initialize object
#001: ../../../src/H5Oattribute.c line 530 in H5O_attr_open_by_name(): can't locate attribute: '/Data/version'
major: Attribute
minor: Object not found
terminate called after throwing an instance of 'H5::AttributeIException'
Вероятно, это связано с тем, что я не могу использовать абсолютные пути из корня файла для доступа к атрибутам. Объекты groups уже были закрыты во время модификации, но я хочу получить доступ к их атрибутам.
Кто-нибудь знает, как это делается правильно?
Ответ №1:
Не уверен, как решить проблему с используемой вами библиотекой HDF5, но с HDFql на C это можно сделать следующим образом:
// create HDF5 file 'test.h5' and use (i.e. open) it
HDFql::execute("create and use file test.h5");
// create group 'Data'
HDFql::execute("create group Data");
// create attribute 'version' (in group 'Data') of data type int with an initial value of '1'
HDFql::execute("create attribute Data/version as int values(1)");
// insert (i.e. write) value '2' into attribute 'version'
HDFql::execute("insert into Data/version values(2)");
Дополнительную информацию можно найти в справочном руководстве по HDFql, а также в примерах, иллюстрирующих, как его использовать.
Комментарии:
1. Спасибо за предложение, я обязательно изучу это и попытаюсь использовать библиотеку HDFql. Я пока не буду закрывать вопрос, на всякий случай, если кто-то решил эту проблему с помощью библиотеки HDF5.