我希望使用 C++ 从 hdf5 文件中进行简单的读取。我将把它分成 4 个部分。 1st 文件的样子。第二我的代码试图读取文件。第三个错误信息。第四,我的结论。
1.The File - 数据集可以在文件中找到,如图所示:
$ h5ls -r myfile.h5
/ Group
/mydata Dataset {1200}
注意 - 数据集是一个包含 1200 个字符串的数组。请注意,CTYPE 是 H5T_C_S1
,我将使用它来读取它。
HDF5 "myfile.h5" {
GROUP "/" {
DATASET "mydata" {
DATATYPE H5T_STRING {
STRSIZE H5T_VARIABLE;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_UTF8;
CTYPE H5T_C_S1;
}
DATASPACE SIMPLE { ( 1200 ) / ( 1200 ) }
DATA {
(0): "pxsntpfcnkeesswwpwopksu", "exsytafcbkecsswwpwopnng",
(2): "ebswtlfcbnecsswwpwopnnm", "pxywtpfcnneesswwpwopksu",
(4): "exsgfnfwbktesswwpwoenag", "exyytafcbnecsswwpwopkng",
2.代码——我的代码尝试像这样读取数据集:
#include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif
const H5std_string FILE_NAME("myfile.h5");
const H5std_string DATASET_NAME("mydata");
// open file
H5File file(FILE_NAME, H5F_ACC_RDONLY);
// get dataset
DataSet dataset = file.openDataSet(DATASET_NAME);
// get src dataspace
DataSpace src = dataset.getSpace();
// get dimensions
int NUM_DIMS = src.getSimpleExtentNdims();
std::vector<hsize_t> dims(NUM_DIMS);
src.getSimpleExtentDims(&dims[0]);
hsize_t height = dims[0];
hsize_t width = 23;
// define src hyperslab
std::vector<hsize_t> count(NUM_DIMS, 1);
std::vector<hsize_t> offset(NUM_DIMS, 0);
src.selectHyperslab(H5S_SELECT_SET, &count[0], &offset[0]);
// define dst hyperslab
DataSpace dst(NUM_DIMS, dims);
dst.selectHyperslab(H5S_SELECT_SET, &count[0], &offset[0]);
// read data into memory, array of cstrings
std::vector<char*> data_out(height);
dataset.read(&data_out[0], H5T_C_S1, dst, src);
// print first line
std::cout << data_out[0] << std::endl;
3.错误 - 然而,它失败是因为 src
和 dst
hyperslabs 之间的类型不匹配,即使我将 src
和 dst
设计为具有相同的尺寸。错误信息如下:
HDF5-DIAG: Error detected in HDF5 (1.10.3) thread 0:
#000: H5Dio.c line 199 in H5Dread(): can't read data
major: Dataset
minor: Read failed
#001: H5Dio.c line 467 in H5D__read(): unable to set up type info
major: Dataset
minor: Unable to initialize object
#002: H5Dio.c line 993 in H5D__typeinfo_init(): unable to convert between src and dest datatype
major: Dataset
minor: Feature is unsupported
#003: H5T.c line 4546 in H5T_path_find(): can't find datatype conversion path
major: Datatype
minor: Can't get value
#004: H5T.c line 4762 in H5T__path_find_real(): no appropriate function for conversion path
major: Datatype
minor: Unable to initialize object
HDF5-DIAG: Error detected in HDF5 (1.10.3) thread 0:
#000: H5T.c line 1756 in H5Tclose(): immutable datatype
major: Invalid arguments to routine
minor: Bad value
DataType::~DataType - H5Tclose failed
4.我的结论 - 我尝试了很多变化,包括删除 dst
和 src
作为 dataset.read()
的参数,改变H5T_C_S1
到 PredType::C_S1
和 PredType::NATIVE_CHAR
,但是同样的错误仍然存在。
我如何简单地将数据集读入内存?数据类型真的不匹配还是有其他我没有定义的东西?我还在读取函数中使用错误的数据类型吗?我是否错误地定义了我的 hyperslab,以至于实际上存在类型不匹配?
最佳答案
也许你想尝试一下 HDFql并将自己从 HDF5 低级细节中抽象出来。在使用 HDFql 的 C++ 中,您可以像这样读取可变长度字符数据集 mydata
(包含在文件 myfile.h5
中):
HDFql::execute("SELECT FROM myfile.h5 mydata"); // select (i.e. read) dataset "mydata" from file "myfile.h5" and populate default cursor with it
while(HDFql::cursorNext() == HDFql::Success) // display content of default cursor
{
std::cout << HDFql::cursorGetChar() << std::endl;
}
关于c++ - HDF5 简单读取数据集失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558544/