2012-12-11 4 views
2

Microsoft Visual C++ 2008의 H5 파일에서 데이터 세트를 읽습니다. 모든 것이 int 및 double 유형의 데이터에 잘 작동하지만 문자열을 찾을 때 문제가 발생합니다. H5 파일에는 18 개의 고정 길이 24 개의 문자열이 있습니다. 내 코드는 다음과 같습니다.C++에서 hdf5에서 문자열 읽기.

StrType strdatatype(PredType::C_S1, 24); 
char *buffer1[18]; 
DataSet datasetCurveNames = riskFactorsH5.openDataSet("/gstrCurveNames"); 

datasetCurveNames.read(&buffer1, strdatatype); 

실행 중 버퍼 1은 불량 포인터로 채워집니다. 대안으로 H5T_VARIABLE을 사용하여 수정 된 가변 길이 문자열을 관리하려고 시도했습니다.

이 또한 실패합니다. 누군가가이 문제에 관해 밝혀 낼 수 있다면 많은 도움이 될 것입니다.

건배, 루카스

답변

1

당신은 전체 문자열 메모리를 할당 할 필요가, 라이브러리는 당신을 위해 그것을 할 수 없습니다. 당신은해야

char buffer1[18][24]; 

datasetCurveNames.read(&buffer1, strdatatype); 

에 의해

char *buffer1[18]; 

를 교체해야

datasetCurveNames.read(buffer1, strdatatype); 

(NO &)

5

HDF5 C++ API는 문서화가 잘되어 있지 않습니다. 이것은 데이터 집합에서 문자열을 읽는 방법입니다. 코드 완성 IDE의 도움으로 이것을 알아 냈습니다 :

using namespace H5; 
std::string field_name("name of the field"); 
StrType datatype(0, H5T_VARIABLE); 
DataSpace dataspace(H5S_SCALAR); 
DataSet datset = group.openDataSet(field_name); 

std::string field_value; 
datset.read(field_value, datatype, dataspace); 
+0

어떻게 작동합니까? 'field_value'에 대한 메모리가 언제 할당됩니까? – Walter

+0

@Walter std :: string 클래스에는 자체 메모리 관리가 포함되어 있습니다. std :: string을 만들고 C 문자열로 지정할 수 있습니다. 데이터를 적절하게 저장하기 위해 내부 배열의 크기를 조정합니다. 또는 std :: string :: resize를 직접 호출하여 내부 메모리 배열의 크기를 변경하고 문자를 할당 할 수 있습니다. std :: string 및 해당 메모리에 대한 자세한 내용은 http://stackoverflow.com/q/9521629/950677을 참조하십시오. – Nathan

+0

나는 그 모든 것을 알고있다. 내가 모르는 것은'DataSet :: read()'가 C- 문자열을 할당한다는 것이다. 이것은 데이터 유형에서 명백한 것입니까? (나를 위해 아닌). – Walter