Я пытался найти способ обойти некоторые недостатки привязок HDF5 C++. В настоящее время мой код завален блоками try/catch, подобными следующим:
H5::Exception::dontPrint();
H5::H5File *file = NULL;
try {
file = new H5::H5File(fname.c_str(), H5F_ACC_RDWR);
} catch(H5::FileIException &file_exists_err) {
file = new H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
}
В этом нет необходимости - все, что я хочу сделать, это открыть файл для чтения/записи и, если он не существует, создать его. Другая, более сложная проблема заключается в создании вложенной группы (например, «/parent/group»), где родительская группа не обязательно существует. В Unix/Linux эквивалентом будет
mkdir -p parent/group
Однако в привязках HDF5 C++ создание группы, родительская группа которой не существует, вызывает исключение.
По этим причинам я решил создать заголовочный файл, который касается некоторых из этих распространенных проблем. Моей первой мыслью было просто создать набор функций, которые бы, например, брали имя файла и режим доступа и возвращали объект H5::H5File, или брали имя группы и возвращали групповой объект. Однако я думаю, что это далеко не идеально, поскольку программисту, использующему этот заголовочный файл, предоставляется возможность вызывать «удалить» для возвращаемых объектов, даже если программист никогда явно не вызывает «новый» в своем собственном коде. Кажется, это требует утечки памяти.
Поэтому моей второй мыслью было создать набор производных классов от H5::H5File и H5::H5Group с конструкторами, которые не генерируют исключения, когда файл еще не существует или когда родительская группа группы еще не существует. . Моя попытка для производного класса файла была следующей:
namespace H5Utils {
class H5File : public H5::H5File {
public:
H5File(std::string fname);
~H5File();
};
}
H5Utils::H5File::H5File(std::string fname)
try : H5::H5File(fname.c_str(), H5F_ACC_RDWR)
{
std::cerr << "Opened existing file." << std::endl;
} catch(H5::FileIException &file_exists_err) {
std::cerr << "File does not exist. Creating new file." << std::endl;
H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
}
H5Utils::H5File::~H5File() { }
Проблема, с которой я сталкиваюсь, двояка. Во-первых, блок try/catch в конструкторе повторно выдает исключение, созданное
H5::H5File(fname.c_str(), H5F_ACC_RDWR)
когда файл не существует, программа все равно завершается. Вторая проблема заключается в том, что я не уверен, что второй конструктор,
H5::H5File(fname.c_str(), H5F_ACC_TRUNC);
правильно (т. е. создает ли он родительский класс?) Есть ли способ, чтобы производный класс перехватывал исключения в конструкторе базового класса, а затем вызывал другой конструктор для базового класса?
В общем, может ли кто-нибудь придумать лучший/более элегантный способ борьбы с этими недостатками привязок HDF5 C++?
H5::FileIException
), создайте ее. Я написал некоторые вспомогательные функции, решающие эту проблему. - person apdnu   schedule 13.05.2015