2013-12-03 1 views
1

나는 왜 내가 이러한 오류를 얻고 있는지 궁금합니다. 이미 H5cpp.h가 포함되어 있습니다. 기존 hdf5 데이터베이스에서 문자열을 읽으려고합니다. 또한 memspace를 어떻게 정의 할 것인지 잘 모르겠습니다. 당신open hdf5 string dataset

Reader.cpp: In member function ‘void Reader::SetFasta()’: 
Reader.cpp:10: error: ‘DataSet’ was not declared in this scope 
Reader.cpp:10: error: expected ‘;’ before ‘dataset’ 
Reader.cpp:11: error: ‘DataSpace’ was not declared in this scope 
Reader.cpp:11: error: expected ‘;’ before ‘dataspace’ 
Reader.cpp:12: error: ‘dataset’ was not declared in this scope 
Reader.cpp:12: error: ‘PredType’ has not been declared 
Reader.cpp:12: error: expected unqualified-id before ‘(’ token 
Reader.cpp:12: error: ‘memspace’ was not declared in this scope 
Reader.cpp:12: error: ‘dataspace’ was not declared in this scope 

에게 Reader.h

#ifndef READER_H 
#define READER_H 
#include <string> 
#include "H5Cpp.h" 
#define FILEHDF "/media/data/back_up.h5" 
class Reader 
{ 
private: 
hid_t file_id, dataset_id, dataspace_id, group_id,strtype, memtype; 
hsize_t dims[1]; 
herr_t status; 
std::string m_fasta; 
Reader() {} 
public: 
Reader(std::string prot_name); 
void SetFasta(); 
std::string GetFasta() {return m_fasta;} 
}; 
#endif 

Reader.cpp 감사

#include "Reader.h" 
Reader::Reader(std::string prot_name) 
{ 
file_id=H5Fopen(FILEHDF, H5F_ACC_RDWR, H5P_DEFAULT); 
group_id=H5Gopen2(file_id, prot_name.c_str(), H5P_DEFAULT); 
SetFasta(); 
} 
void Reader::SetFasta() 
{ 
DataSet dataset=file_id.openDataSet("Fasta_seq"); 
DataSpace dataspace=dataset.getSpace(); 
dataset.read(m_fasta, PredType::H5T_C_S1, memspace, dataspace); 
} 

MAIN.CPP

#include <iostream> 
using namespace std; 
#include <string> 
#include "Reader.h" 
#include "H5Cpp.h" 
int main() 
{ std::string prot_name, fasta_seq; 
prot_name="102LA"; 
Reader rd(prot_name); 
fasta_seq=rd.GetFasta(); 
cout<<fasta_seq; 
return 0; 
} 

답변

1

같습니다 DataSet, DataSpace 및,373 같은 210은 모두 H5 네임 스페이스에 있습니다. 당신은 다음 중 하나를 수행해야합니다 :

  • 완전히 타입 이름을 정규화 (즉 H5::DataSet, H5::DataSpaceH5::PredType으로, 당신의 변수를 선언)
  • 대신 auto를 사용 (있는 경우는 C++ 11 사용) 컴파일러가 알아낼 수 있도록
  • 파일의 맨 위에 파일을 넣으십시오. 일반적으로 헤더에 #include 헤더가있는 모든 사람이 암시 적으로 using namespace H5으로 끝나는 방식으로 헤더에 넣으면 나쁜 형식으로 간주됩니다 그래도 좋겠지 만 .cpp에 using 선언이 있으면 괜찮습니다. 파일).
3

이 C++에서 HDF5를 사용하는 방법에 대한 (매우 간단) 예입니다

#include<iostream> 
#include<array> 

#include<H5Cpp.h> 

int main() { 
    // store this array as a 3x2 matrix: 
    // 
    // | 1 2 | 
    // | 3 4 | 
    // | 5 6 | 
    // 
    std::array<int, 6> data = {1, 2, 3, 4, 5, 6}; 


    H5::H5File fp("../data/test01.h5", H5F_ACC_TRUNC); 
    hsize_t dim[2] = {3, 2}; 
    H5::DataSpace dspace(2, dim); // 2 is the rank of the matrix 
    H5::DataSet dset = fp.createDataSet("My Test01 Data", H5::PredType::NATIVE_DOUBLE, dspace); 
    dset.write(data.data(), H5::PredType::NATIVE_INT); 

    return 0; 

} 

는 그리고이 예는 조금 더 정교하지만, 아주 (읽기 및 쓰기 작업을 수행하는 방법을 보여줍니다) 단순 :

#include<iostream> 
#include<vector> 
#include<H5Cpp.h> 

void store(const std::string& filename, const std::string& dataset, const std::vector<double>& data) { 
    H5::H5File fp(filename.c_str(), H5F_ACC_TRUNC); 
    hsize_t dim[2] = {data.size(), 1}; 
    H5::DataSpace dspace(1, dim); // 1 is the rank of the matrix 
    H5::DataSet dset = fp.createDataSet(dataset.c_str(), H5::PredType::NATIVE_DOUBLE, dspace); 
    dset.write(data.data(), H5::PredType::NATIVE_DOUBLE); 
    fp.close(); 
} 

std::vector<double> load(const std::string& filename, const std::string& dataset) { 
    H5::H5File fp(filename.c_str(), H5F_ACC_RDONLY); 
    H5::DataSet dset = fp.openDataSet(dataset.c_str()); 
    H5::DataSpace dspace = dset.getSpace(); 
    hsize_t rank; 
    hsize_t dims[2]; 
    rank = dspace.getSimpleExtentDims(dims, nullptr); 
    std::vector<double> data; 
    data.resize(dims[0]); 
    dset.read(data.data(), H5::PredType::NATIVE_DOUBLE, dspace); 
    fp.close(); 
    return data; 
} 

int main() { 
    std::vector<double> data = {1, 2, 3, 4, 5, 6}; 
    store("mydata.h5", "my dataset", data); 
    auto data_read = load("mydata.h5", "my dataset"); 
    for(auto item: data_read) { 
    std::cout<<item<<" "; 
    } 
    std::cout<<std::endl; 
    return 0; 
} 

나는 OS X 10.7.4에서 GCC 4.8.1로 컴파일 :

$ g++ example.cpp -std=c++11 -lhdf5_cpp -lhdf5 
,691,363 (210)

및 얻을 : 내 경우에 대한 해결책을 도울 수 있다면

$ ./a.out 
1 2 3 4 5 6 
+0

이 감사합니다 ... http://stackoverflow.com/questions/28792297/hdf5-c-api-read-multiple-dataset-from -a-single-h5-file – lorniper