2013-12-03 37 views
1

我只是想知道为什么我得到这些错误。我已经包含H5cpp.h.Here我只是想从现有的hdf5数据库读取一个字符串。此外我不知道如何定义memspace。谢谢打开hdf5字符串数据集

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

它看起来像DataSetDataSpacePredType都在H5命名空间中。你需要做以下之一:

  • 完全限定的类型名称(即,为H5::DataSetH5::DataSpaceH5::PredType声明变量)
  • (如果使用C++ 11)使用auto相反,并让编译器将其计算出来
  • using namespace H5放在文件的顶部附近(如果将它放在标题中,通常认为这是错误的形式,因此无论它们是否以隐含的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 

并获得:

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

感激,如果你能与我的情况的解决方案帮助... http://stackoverflow.com/questions/28792297/hdf5-c-api-read-multiple-dataset-from -a单H5文件 – lorniper