HDF5複合データセットにC++データ構造を保存しようとしています。これらのデータ構造には、PODタイプとstd :: stringが含まれています。 std :: stringを正しく処理するために、構造体A
ごとに構造CA
を作成します。std::string
をconst char*
ポインタで置き換えます。ポインタはstd::string
(返り値はc_str
メソッド)です。HDF5 C++:複合データセットに文字列を書き込む
これを実行すると、以下に不思議な結果が表示されます。私はdebian Jessie
でHDF5バージョン1.8.13
を使用しています。
私は裸の最小限に私のテストを簡素化しようとしました。ここでH5::DataSet
を足すためのコードは(r
はHDF5ファイルのルートグループである)である:
//! a simple example of C-struct with a string
struct CString
{
//! pointer to a C-string
const char* value;
}; // end of struct CString
// compound description
H5::CompType c(sizeof(CString));
c.insertMember("value", HOFFSET(CString,value),H5::PredType::C_S1);
// value to be stored
std::string test = "my test value";
// place holder
CString ctest;
// not working: ctest.value= test.c_str()
ctest.value = strdup(test.c_str());
// data set creation
hsize_t dim[] = {1};
const auto d = r.createDataSet("test",c,DataSpace(1,dim));
d.write(&ctest,c);
ポイントは、私はHDF5ファイル内の値を取得するには、文字列のコピーを作成しなければならないということです。さもなければ、私はゴミを得る。ここで
が作成されたファイルから値を読み込むためのコードです:const auto f = File("test.hf5",H5F_ACC_RDONLY);
const auto r = f.getRoot();
// compound description
H5::CompType c(sizeof(CString));
c.insertMember("value", HOFFSET(CString,value),H5::PredType::C_S1);
// value to be read
CString test;
// reading
const auto d = r.openDataSet("test");
d.read(&test,c);
std::cout << test.value << std::endl;
文字列Aのコピーと
(ここでFile
getRoot方法を提供H5Fileクラスの周りのシンプルなラッパーです) 、出力は「私のテスト値」です。 文字列をコピーしないと、出力は "A"になります。
この動作は、HDF5でstd :: stringを書き込んだり読んだりするために読んださまざまな記事と矛盾しているようです。しかし、これらの投稿は複合データセットを一度も処理しませんでした。
ご協力いただければ幸いです。