读取单值 HDF5 C++
read single value HDF5 C++
情况:
我尝试从 .hdf5
文件中读取一个值。
系统:
- Windows 7(64 位)
- c++(MSVC17 64 位)
- Qt Creator (5.10.1)
- HDF5 (1.8.15)
我的代码:
//File Path
hid_t H5_hid_RESULTS = H5Fcreate (V_FIn_HDF5_Path.absoluteFilePath().toUtf8().constData(), H5F_ACC_RDONLY, H5P_DEFAULT, H5P_DEFAULT);
//Status (Error Output?)
herr_t status;
//read dataset "heigth"
int32_t heigth[1];
hid_t H5_hid_heigth = H5Dopen1(H5_hid_RESULTS, "heigth");
status = H5Dread(H5_hid_heigth, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, heigth);
qDebug() << "heigth" << heigth[0];
status = H5Dclose(H5_hid_heigth);
//Close: file
status = H5Fclose (H5_hid_RESULTS);
目标 .hdf5 文件(在查看器中):
结果:
qDebug 打印一个随机数(例如:104610208)而不是预期的 512。
问题:
- 为什么会这样?
- 我应该更改什么以读取整数、浮点数等?使用 2D 自制数组可以正常工作,但不能使用我需要阅读的 .hdf5 中的单个值。
我试过的:
- 我尝试使用
int[1]
而不是 int32_t[1]
:相同的结果。
- 我尝试使用
int
而不是 int32_t[1]
:
D:\...\xyz.cpp:47: Error: C2664: "herr_t H5Dread(hid_t,hid_t,hid_t,hid_t,hid_t,void *)" : Conversion from argument 6 from "int" to "void *" not possible
- 我尝试使用
int*
而不是 int32_t[1]
: 0x7fe00000001
我猜值的地址。如果我尝试打印 *heigth
而不是 heigth
,它会在调用函数时崩溃
- 我尝试了一些其他格式并投射,但没有努力。
- 我尝试传递
"/heigth"
而不是 "heigth"
:相同的结果。
如文件查看器所示,您的 512 数据类型是 H5T_NATIVE_INT32
而不是 H5T_NATIVE_INT
。换句话说,您正在尝试读取一个 64 位整数,而只有一个 32 位整数。这应该适合你:
status = H5Dread(H5_hid_heigth, H5T_NATIVE_INT32,
H5S_ALL, H5S_ALL, H5P_DEFAULT, heigth);
我用一种完全不同但非常简单的方法解决了这个问题 example 这里。与 link 中的代码基本相同,但非常简化,因此 c++ 和 HDF5 的新手可以理解它:
//open file (My path is zensored, project from work)
const H5std_string H5_Path_Results("C:/.../results.hdf5");
H5File H5_File_Results(H5_Path_Results, H5F_ACC_RDONLY);
//open set
const H5std_string H5_Nam_Height("height");
DataSet H5_Set_Height = H5_File_Results.openDataSet(H5_Nam_Height);
//read set
int height[1];
H5_Set_Height.read(height, PredType::NATIVE_INT, H5S_ALL, H5S_ALL);
qDebug() << height[0];
//close set
H5_Set_Height.close();
//close file
H5_File_Results.close();
这给出了我想要读取的 512 作为输出。
当然需要#include <hdf5.h>
和#include <H5Cpp.h>
,库必须添加到项目中并且.hdf5
文件必须存在。
情况:
我尝试从 .hdf5
文件中读取一个值。
系统:
- Windows 7(64 位)
- c++(MSVC17 64 位)
- Qt Creator (5.10.1)
- HDF5 (1.8.15)
我的代码:
//File Path
hid_t H5_hid_RESULTS = H5Fcreate (V_FIn_HDF5_Path.absoluteFilePath().toUtf8().constData(), H5F_ACC_RDONLY, H5P_DEFAULT, H5P_DEFAULT);
//Status (Error Output?)
herr_t status;
//read dataset "heigth"
int32_t heigth[1];
hid_t H5_hid_heigth = H5Dopen1(H5_hid_RESULTS, "heigth");
status = H5Dread(H5_hid_heigth, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, heigth);
qDebug() << "heigth" << heigth[0];
status = H5Dclose(H5_hid_heigth);
//Close: file
status = H5Fclose (H5_hid_RESULTS);
目标 .hdf5 文件(在查看器中):
结果:
qDebug 打印一个随机数(例如:104610208)而不是预期的 512。
问题:
- 为什么会这样?
- 我应该更改什么以读取整数、浮点数等?使用 2D 自制数组可以正常工作,但不能使用我需要阅读的 .hdf5 中的单个值。
我试过的:
- 我尝试使用
int[1]
而不是int32_t[1]
:相同的结果。 - 我尝试使用
int
而不是 int32_t[1]
:D:\...\xyz.cpp:47: Error: C2664: "herr_t H5Dread(hid_t,hid_t,hid_t,hid_t,hid_t,void *)" : Conversion from argument 6 from "int" to "void *" not possible
- 我尝试使用
int*
而不是int32_t[1]
:0x7fe00000001
我猜值的地址。如果我尝试打印*heigth
而不是heigth
,它会在调用函数时崩溃 - 我尝试了一些其他格式并投射,但没有努力。
- 我尝试传递
"/heigth"
而不是"heigth"
:相同的结果。
如文件查看器所示,您的 512 数据类型是 H5T_NATIVE_INT32
而不是 H5T_NATIVE_INT
。换句话说,您正在尝试读取一个 64 位整数,而只有一个 32 位整数。这应该适合你:
status = H5Dread(H5_hid_heigth, H5T_NATIVE_INT32,
H5S_ALL, H5S_ALL, H5P_DEFAULT, heigth);
我用一种完全不同但非常简单的方法解决了这个问题 example 这里。与 link 中的代码基本相同,但非常简化,因此 c++ 和 HDF5 的新手可以理解它:
//open file (My path is zensored, project from work)
const H5std_string H5_Path_Results("C:/.../results.hdf5");
H5File H5_File_Results(H5_Path_Results, H5F_ACC_RDONLY);
//open set
const H5std_string H5_Nam_Height("height");
DataSet H5_Set_Height = H5_File_Results.openDataSet(H5_Nam_Height);
//read set
int height[1];
H5_Set_Height.read(height, PredType::NATIVE_INT, H5S_ALL, H5S_ALL);
qDebug() << height[0];
//close set
H5_Set_Height.close();
//close file
H5_File_Results.close();
这给出了我想要读取的 512 作为输出。
当然需要#include <hdf5.h>
和#include <H5Cpp.h>
,库必须添加到项目中并且.hdf5
文件必须存在。