Как изменить атрибуты существующего объекта с помощью библиотеки HDF5?

#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.