HDF5文件操作中的运行时错误

时间:2014-02-18 20:20:30

标签: c++ hdf5

我正在尝试一个程序,我将一个结构数组转换为字节数组,然后将它们多次保存到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;
}

我得到的输出是,

enter image description here

当我使用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

请帮助我解决这个问题。提前谢谢..

1 个答案:

答案 0 :(得分:0)

主要问题是type数据类型的大小。它应该是sizeof(obj)而不是100*sizeof(obj)

无论如何,您不应该使用字符串数据类型,而应该使用 opaque 数据类型,因为它就是这样,所以您可以通过以下方式替换整行:

DataType type(H5T_OPAQUE, sizeof(obj));

第二个问题出在read。要么你阅读了所有内容,你需要确保inData足够大,即100*sizeof(obj)而不是sizeof(obj),或者你需要选择你想要阅读的元素,就像write