問題を解決するための別の方法(すなわちHDF5データセットのデータ型を見つけるためには)次のようにC++のためのツールHDFqlを使用することです(この例では、ファイルexample.h5
とデータセットmy_dataset
がすでに存在していることを前提としてい):
// include HDFql C++ header file (make sure it can be found by the C++ compiler)
#include <iostream>
#include "HDFql.hpp"
int main(int argc, char *argv[])
{
int datatype;
// use (i.e. open) HDF file "example.h5"
HDFql::execute("USE FILE example.h5");
// get datatype of dataset "my_dataset" and populate HDFql default cursor with it
HDFql::execute("SHOW DATATYPE my_dataset");
// move HDFql default cursor to first position
HDFql::cursorFirst();
// retrieve datatype from HDFql default cursor
datatype = *HDFql::cursorGetInt();
// print message according to datatype
if (datatype == HDFql::TinyInt || datatype == HDFql::VarTinyInt)
std::cout << "Datatype is a char";
else if (datatype == HDFql::UnsignedTinyInt || datatype == HDFql::UnsignedVarTinyInt)
std::cout << "Datatype is an unsigned char";
else if (datatype == HDFql::SmallInt || datatype == HDFql::VarSmallInt)
std::cout << "Datatype is a short";
else if (datatype == HDFql::UnsignedSmallInt || datatype == HDFql::UnsignedVarSmallInt)
std::cout << "Datatype is an unsigned short";
else if (datatype == HDFql::Int || datatype == HDFql::VarInt)
std::cout << "Datatype is an int";
else if (datatype == HDFql::UnsignedInt || datatype == HDFql::UnsignedVarInt)
std::cout << "Datatype is an unsigned int";
else if (datatype == HDFql::BigInt || datatype == HDFql::VarBigInt)
std::cout << "Datatype is a long long";
else if (datatype == HDFql::UnsignedBigInt || datatype == HDFql::UnsignedVarBigInt)
std::cout << "Datatype is an unsigned long long";
else if (datatype == HDFql::Float || datatype == HDFql::VarFloat)
std::cout << "Datatype is a float";
else if (datatype == HDFql::Double || datatype == HDFql::VarDouble)
std::cout << "Datatype is a double";
else if (datatype == HDFql::Char || datatype == HDFql::VarChar)
std::cout << "Datatype is a char";
else if (datatype == HDFql::Opaque)
std::cout << "Datatype is an opaque";
else
std::cout << "Unknown datatype";
return 0;
}
最終的に、エンディアンまたはデータセットmy_dataset
のサイズを取得する必要がある場合は、HDFql::execute("SHOW ENDIANNESS my_dataset");
またはHDFql::execute("SHOW SIZE my_dataset");
を実行します。
出典
2017-03-25 18:27:52
SOG
これがなぜHDF5-Libraryの機能として組み込まれていないのか不思議です。あなたの方法は常に正しいですか?または、あなたが使用した仮定がありますか? – NOhs
今は失敗するケースは一切見つからないので、私はその投稿を更新します。 –