Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/C++HDF5读取字符串属性_C++_Hdf5_Hdf - Fatal编程技术网

C/C++HDF5读取字符串属性

C/C++HDF5读取字符串属性,c++,hdf5,hdf,C++,Hdf5,Hdf,我的一位同事使用labview将ASCII字符串作为属性写入HDF5文件。我可以看到该属性存在并读取它,但无法打印它 该属性为,如HDF查看器中所示: 日期=2015年7月9日 所以日期就是它的名字 我正在尝试使用此代码读取属性 hsize_t sz = H5Aget_storage_size(dateAttribHandler); std::cout<<sz<<std::endl; //prints 16 hid_t atype = H5Aget_type(dateAt

我的一位同事使用labview将ASCII字符串作为属性写入HDF5文件。我可以看到该属性存在并读取它,但无法打印它

该属性为,如HDF查看器中所示:

日期=2015年7月9日

所以日期就是它的名字

我正在尝试使用此代码读取属性

hsize_t sz = H5Aget_storage_size(dateAttribHandler);
std::cout<<sz<<std::endl; //prints 16
hid_t atype = H5Aget_type(dateAttribHandler);
std::cout<<atype<<std::endl; //prints 50331867
std::cout<<H5Aread(dateAttribHandler,atype,(void*)date)<<std::endl; //prints 0
std::cout<<date<<std::endl; //prints messy characters!
//even with an std::string
std::string s(date);
std::cout<<s<<std::endl; //also prints a mess
此程序的打印输出:

Success read file into memory: 0
Reading file done.
Open handler: 16777216
DS handler: 83886080
Attributes exists: 1
16
mem bef: 
50331867
0
Attribute string read was '�P7'
mem aft: �P7
�P7
Press <RETURN> to close this window...

谢谢。

我发现如果您不分配日期并将&date传递给H5Aread,那么它就可以工作了。我使用C++和Python API,所以我不太了解C API。具体变化:

char* date = 0;
// std::cout<<"mem bef: "<<date<<std::endl;    

std::cout << H5Aread(dateAttribHandler, atype, &date) << std::endl;
您应该看到2015年7月9日打印的

<>你可能想考虑使用C++ API。使用C++ API,你的例子变成:

std::string filename("c:/temp/Example.hdf5");
H5::H5File file(filename, H5F_ACC_RDONLY);
H5::DataSet ds_mag = file.openDataSet("MagneticFields");

if (ds_mag.attrExists("Date"))
{
    H5::Attribute attr_date = ds_mag.openAttribute("Date");
    H5::StrType stype = attr_date.getStrType();
    std::string date_str;
    attr_date.read(stype, date_str);
    std::cout << "date_str= <" << date_str << ">" << std::endl;
}
事实证明,H5Aread必须使用char指针的引用来调用。。。指针的指针:

H5Aread(dateAttribHandler,atype,&date);
请记住,人们不必为此保留记忆。库将保留内存,然后您可以使用H5free_memorydate释放它

这很有效

编辑:


我了解到,只有当要读取的字符串长度可变时,才会出现这种情况。如果字符串具有固定长度,则必须手动保留大小长度为+1的内存,甚至手动将最后一个字符设置为null,以获得以null结尾的字符串。hdf5库中有一个函数,用于检查字符串的长度是否固定

你如何定义日期?从H5Aread文档来看,日期似乎需要是一个预先分配的内存缓冲区。就像这个字符日期[1024]。@HughB它是一个字符*日期=新字符[sz]。我试着把尺寸放大,但没有成功。你需要提供更完整的示例代码。什么是C++日期变量?这些乱七八糟的角色是什么?第一个“2”读对了吗?@phil我在评论中提到了日期结构。接下来的字符是一些不可读的字符。这些信息足够吗?没有正确读取的内容。@Phil,这是您要求的完整程序,包括输出。谢谢您的回答。我不能使用C++ API,因为我需要在内存中读取图像,如我的例子所示。实际上,我碰巧找到了解决方案,将H5D区域中的date替换为&date。。。我不明白为什么。。。它看起来像一个指针中的一个指针,但它工作得很好……使用H5Awrite编写代码也是如此。这个例子显示了这一点,但由于它们使用的字符串数据向量,我没有意识到这一点。将可变长度字符串写入数据集也是如此。
H5Aread(dateAttribHandler,atype,&date);