2017-01-18 23 views
1

HDF5複合データセットにC++データ構造を保存しようとしています。これらのデータ構造には、PODタイプとstd :: stringが含まれています。 std :: stringを正しく処理するために、構造体Aごとに構造CAを作成します。std::stringconst 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を書き込んだり読んだりするために読んださまざまな記事と矛盾しているようです。しかし、これらの投稿は複合データセットを一度も処理しませんでした。

ご協力いただければ幸いです。

答えて

1

私はようやく答えを見つけました。

H5::CompType c(sizeof(CString)); 
H5::StrType stype(H5::PredType::C_S1, H5T_VARIABLE); 
c.insertMember("value", HOFFSET(CString,value),stype); 

文字列をコピーすることは幸運のいくつかの並べ替えで、私のテストのメモリレイアウトに関係しているときの例では、働いていたという事実を私は次のようにvalueメンバーの定義を変更する必要があります。

よろしくお願いいたします。

関連する問題