当我尝试将无符号long long属性添加到数据集时,会添加该属性,但不会添加该值。对整数使用类似的方法似乎工作文件。
使用HDF视图查看属性。将显示属性名称,但对于unsigned long long属性,值不可见
代码如下:
herr_t Result;
//Open the file
hid_t DataFile = H5Fopen(FileName, H5F_ACC_RDWR, H5P_DEFAULT);
//Open the dataset
hid_t DataSet = H5Dopen2(DataFile, "/Summary", H5P_DEFAULT);
//Create the data space for the attribute.
hsize_t AttributeDims = 1;
hid_t AttributeDataSpace = H5Screate_simple(1, &AttributeDims , NULL);
hid_t Attribute;
//Attribute 1: Fail to write a long long attribute
Attribute = H5Acreate2 (DataSet, "LongAttribute", H5T_STD_U64BE, AttributeDataSpace, H5P_DEFAULT, H5P_DEFAULT);
if (Attribute < 0) {
fprintf(stdout, "Failed to add the unsigned long long attribute to the file %s.", FileName);
return false;
}
//Write the attribute data
unsigned long long* ULLAttribute = (unsigned long long*) malloc(sizeof(unsigned long long) * 1);
ULLAttribute[0] = (unsigned long long) 4;
Result = H5Awrite(Attribute, H5T_NATIVE_ULLONG, ULLAttribute);
if (Result < 0) {
fprintf(stdout, "Failed to write the unsigned long long attribute to the file %s.", FileName);
return false;
}
//Attribute 2: Succesfully Write a integer attribute
Attribute = H5Acreate2 (DataSet, "IntAttribute", H5T_STD_I32BE, AttributeDataSpace, H5P_DEFAULT, H5P_DEFAULT);
if (Attribute < 0) {
fprintf(stdout, "Failed to create the attribute for the file %s.", FileName);
return false;
}
//Write the attribute data
int32_t* IAttribute = (int32_t*) malloc(sizeof(int32_t) * 1);
IAttribute[0] = (int32_t) 4;
Result = H5Awrite(Attribute, H5T_NATIVE_INT, IAttribute);
if (Result < 0) {
fprintf(stdout, "Failed to add the integer attribute to the file %s.", FileName);
return false;
}
//Close the attribute, Dataset and DataFile
Result = H5Aclose(Attribute);
Result = H5Dclose(DataSet);
Result = H5Fclose(DataFile);
执行代码时不会显示任何错误消息,但是当查看HDF5文件时,两个属性都会显示&#34; IntAttribute&#34;和#34; LongAttribute&#34;是可见的,但LongAttribute没有价值。
HFView 2.9,英特尔64上的Fedora 20。
挑选蒂莫西的一些问题 WRT: 你为什么要为属性创建一个简单的数据空间? 我正在咀嚼将模型参数存储为属性,有点像键值对。许多模型参数都是简单的标量值。
WRT: 按照相同的路线,你怎么写属性的数组? 我编辑了一个示例,它在数组中存储了2个值。我从你的例子中看到,你是malloc()的空间,从现在开始我将使用它,因为它似乎更清晰。
WRT: 你在英特尔64上,但你想写大端? 是的:这仍然让我感到困惑:H5T_STD_I32BE和H5T_STD_I32LE都成功运行,但H5T_STD_U64BE和H5T_STD_U64LE都没有在HDFView中显示值。我猜想在HDF5库的某个地方,无论参数如何,它都会检查大端与小端并相应地处理该值。我会尽量不去绊倒这个&#34;功能&#34;后来使用Postgresql二进制数,它们总是大端值。
问题似乎出现在HDFView中,它仍然没有在Timothy的代码生成的ull.h5文件中显示unsigned long long,或者从我的代码中显示:
我正在使用HDFView 2.9 for Linux。正如蒂莫西提到的那样,在HDFView 2.10中我可以使用h5dump。
答案 0 :(得分:1)
有几个问题,应该没问题,但我只是好奇。
这是使用标量数据空间编写属性的简单示例:
#include <stdio.h>
#include <stdlib.h>
#include <hdf5.h>
int
main(int argc, char **argv)
{
unsigned long long *ull = NULL;
hid_t f_id = {0};
hid_t d_id = {0};
hid_t s_id = {0};
hid_t a_id = {0};
hid_t as_id = {0};
hsize_t dims[2] = {2, 2};
herr_t status = {0};
f_id = H5Fcreate("ull.h5",H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
s_id = H5Screate_simple(2, dims, NULL);
d_id = H5Dcreate(f_id, "/data", H5T_STD_I32BE, s_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
as_id = H5Screate(H5S_SCALAR);
a_id = H5Acreate(d_id, "unsigned long long", H5T_STD_U64LE,
as_id, H5P_DEFAULT, H5P_DEFAULT);
ull = malloc(sizeof(unsigned long long));
*ull = 123;
status = H5Awrite(a_id, H5T_NATIVE_ULLONG, ull);
status = H5Aclose(a_id);
status = H5Dclose(d_id);
status = H5Sclose(s_id);
status = H5Fclose(f_id);
return(EXIT_SUCCESS);
}
编译并运行时:
h5pcc -o test test.c && ./test && h5dump ull.h5
我觉得很好:
HDF5 "ull.h5" {
GROUP "/" {
DATASET "data" {
DATATYPE H5T_STD_I32BE
DATASPACE SIMPLE { ( 2, 2 ) / ( 2, 2 ) }
DATA {
(0,0): 0, 0,
(1,0): 0, 0
}
ATTRIBUTE "unsigned long long" {
DATATYPE H5T_STD_U64LE
DATASPACE SCALAR
DATA {
(0): 1234
}
}
}
}
}
当然,如果我将标量属性数据空间更改为一个简单的数据空间,它仍然可以工作:
as_id = H5Screate_simple(1, adims, NULL);
a_id = H5Acreate(d_id, "unsigned long long", H5T_STD_U64LE,
as_id, H5P_DEFAULT, H5P_DEFAULT);
ull = malloc(sizeof(unsigned long long));
*ull = 123;
我们得到:
ATTRIBUTE "unsigned long long" {
DATATYPE H5T_STD_U64LE
DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
DATA {
(0): 123
}
这是一个长篇大论的例子之后,如何做到这一点。看看你的代码,我真的无法找到你的错误。事实上,在空的HDF5文件中使用您的代码可以正常工作:
localhost ~$ h5dump ull.h5
HDF5 "ull.h5" {
GROUP "/" {
DATASET "Summary" {
DATATYPE H5T_STD_I32BE
DATASPACE SIMPLE { ( 2, 2 ) / ( 2, 2 ) }
DATA {
(0,0): 0, 0,
(1,0): 0, 0
}
}
}
}
localhost ~$ ./foo
localhost ~$ h5dump ull.h5
HDF5 "ull.h5" {
GROUP "/" {
DATASET "Summary" {
DATATYPE H5T_STD_I32BE
DATASPACE SIMPLE { ( 2, 2 ) / ( 2, 2 ) }
DATA {
(0,0): 0, 0,
(1,0): 0, 0
}
ATTRIBUTE "IntAttribute" {
DATATYPE H5T_STD_I32BE
DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
DATA {
(0): 4
}
}
ATTRIBUTE "LongAttribute" {
DATATYPE H5T_STD_U64BE
DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
DATA {
(0): 4
}
}
}
}
}
您可以查看(并发布)h5dump
给您的内容吗?也许这仅仅是使用HDFView
?
<强>更新强>
我刚看了HDFView(版本2.10)的文件,看起来没问题。
您可以确认/重新创建错误吗?