我正在尝试一个程序,我将一个结构数组转换为字节数组,然后将它们多次保存到hdf5数据集。 (数据集的维数为100,因此我会执行100次写入操作)。我在将结构转换为字节数组时没有任何问题,当我尝试选择我需要在数据集中写入数据的超文本时,我似乎遇到了问题。我是hdf5的新手。请帮我解决这个问题。
#include "stdafx.h"
#include "h5cpp.h"
#include <iostream>
#include <conio.h>
#include <string>
#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif
using std::cout;
using std::cin;
using std::string;
const H5std_string fName( "dset.h5" );
const H5std_string dsName( "dset" );
struct MyStruct
{
int x[1000],y[1000];
double z[1000];
};
int main()
{
try
{
MyStruct obj[10];
char* totalData;
char* inData;
hsize_t offset[1],count[1];
H5File file("sample.h5", H5F_ACC_TRUNC);
StrType type(PredType::C_S1,100*sizeof(obj));
Group *myGroup = new Group(file.createGroup("\\myGroup"));
hsize_t dim[] = {100};
DataSpace dSpace(1,dim);
DataSet dSet = myGroup->createDataSet("dSet", type, dSpace);
for(int m = 0; m < 100 ; m++)
{
for(int j = 0 ; j < 10 ; j++)
{
for(int i = 0 ; i < 1000 ; i++) // some random values stored
{
obj[j].x[i] = i*13 + i*19;
obj[j].y[i] = i*37 - i*18;
obj[j].z[i] = (i + 1) / (0.4 * i);
}
}
totalData = new char[sizeof(obj)]; // converting struct to byte array
memcpy(totalData, &obj, sizeof(obj));
cout<<"Start Write.\n";
cout<<"Total Size : "<<sizeof(obj)/1000<<"KB\n";
//Exception::dontPrint();
hsize_t dim[] = { 1 }; //I think am screwing up between this line and following 5 lines
DataSpace memSpace(1, dim);
offset[0] = m;
count[0] = 1;
dSpace.selectHyperslab(H5S_SELECT_SET, count, offset);
dSet.write(totalData, type, memSpace, dSpace);
cout<<"Write Done.\n";
cout<<"Read Start.\n";
inData = new char[sizeof(obj)];
dSet.read(inData, type);
cout<<"Read Done\n";
}
delete myGroup;
}
catch(Exception e)
{
e.printError();
}
_getch();
return 0;
}
我得到的输出是,
当我使用H5S_SELECT_APPEND而不是H5S_SELECT_SET时,输出显示
Start Write.
Total Size : 160KB
HDF5-DIAG: Error detected in HDF5 (1.8.12) thread 0:
#000: ..\..\src\H5Shyper.c line 6611 in H5Sselect_hyperslab(): unable to set hyperslab selection
major: Dataspace
minor: Unable to initialize object
#001: ..\..\src\H5Shyper.c line 6477 in H5S_select_hyperslab(): invalid selection operation
major: Invalid arguments to routine
minor: Feature is unsupported
请帮助我解决这个问题。提前谢谢..
答案 0 :(得分:0)
主要问题是type
数据类型的大小。它应该是sizeof(obj)
而不是100*sizeof(obj)
。
无论如何,您不应该使用字符串数据类型,而应该使用 opaque 数据类型,因为它就是这样,所以您可以通过以下方式替换整行:
DataType type(H5T_OPAQUE, sizeof(obj));
第二个问题出在read
。要么你阅读了所有内容,你需要确保inData
足够大,即100*sizeof(obj)
而不是sizeof(obj)
,或者你需要选择你想要阅读的元素,就像write
。