2014-02-18 1 views
0

구조 배열을 바이트 배열로 변환 한 다음 여러 번 hdf5 데이터 세트에 저장하는 프로그램을 시도하고있었습니다. (Dataset은 100이라는 차원을 가지고 있으므로 Ill는 쓰기 작업을 100 번 수행합니다). 구조를 바이트 배열로 변환하는 데 문제가 없다면 데이터 세트에 데이터를 쓰는 데 필요한 하이퍼 슬랩을 선택하려고 할 때 문제가있는 것처럼 보입니다. 나는 hdf5를 처음 사용합니다. 이 문제를 도와주세요.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_SET의 H5S_SELECT_APPEND를 사용하는 경우, 출력은

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

가장 큰 문제는 type 데이터 유형의 크기입니다. sizeof(obj)이어야하며 100*sizeof(obj)이 아야합니다. 그게 무엇인지 이후

어쨌든, 당신은 문자열 데이터 형식 있지만 불투명 데이터 유형을 사용해서는 안된다, 그래서 당신은에 의해이 모든 라인을 대체 할 수있다 : 두 번째 문제는에

DataType type(H5T_OPAQUE, sizeof(obj)); 

read. 모든 것을 읽었을 때 inData이 충분히 크면 sizeof(obj) 대신 100*sizeof(obj)이되어야하거나 write처럼 읽으려는 요소 만 선택해야합니다.

+0

독서에 관심이 없다고 가정하고 내가 읽은 부분을 제외하고 파일에 데이터를 계속 작성한다고 가정합니다. 당신의 대답에 따라, 나는 다음과 같은 변화를하면 일이 가능할 것이라고 생각할 것인가? 1) 타입 문을 DataType 타입으로 변경합니다 (H5T_OPAQUE, sizeof (obj)). (필자는 쓰기 작업을 100 번 수행함을 기억하십시오.)이 프로그램에 대한 쓰기 작업을 수행하는 올바른 방법이라고 언급하십시오. – user3297129

+0

예. 크기가 각각'sizeof (obj)'인 요소 100 개를 가진 배열을 만들고 있다는 것을 기억하십시오. HDF5에서 데이터 유형은 배열의 _one_ 요소 유형이며 _dataspaces_는 요소 수를 포함합니다. – Simon