gpt4 book ai didi

c++ - HDF5挂载文件(带H5Fmount)

转载 作者:行者123 更新时间:2023-11-30 04:06:40 26 4
gpt4 key购买 nike

我尝试将具有相同结构的不同文件挂载到一个新文件(在 C++ 中)。因此,我创建了一个新文件“new.h5”,并在其中创建了一个新组“/G”。现有的两个文件(“file1.h5”和“file2.h5”)在根组“/”中有一些属性,然后是路径“dataset1/data1/data”,其中“dataset1/data1”包含一些属性和“数据”-其中包含数字数据的路径。

 /dataset1
/attribute1
/attribute2
/data1
/data
/attribute1
/attribute2

在新文件中我想要一个结构:

/G
/dataset1
/attribute1
/attribute2
/data1
/data
/attribute1
/attribute2
/dataset2
/attribute1
/attribute2
/data1
/data
/attribute1
/attribute2

我这样试过:

#include "hdf5.h"
#ifdef OLD_HEADER_FILENAME
#include <iostream.h>
#else
#include <iostream>
#endif
#include <string>
#ifndef H5_NO_NAMESPACE
#ifndef H5_NO_STD
using std::cout;
using std::endl;
#endif // H5_NO_STD
#endif
#include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif

#define FILE_NAME_1 "file1.h5"
#define FILE_NAME_2 "file2.h5"
#define FILE_NAME_ALL "new.h5"

int main(void)
{

hid_t fid1, fid2, fid3, gid; /* Files and group identifiers */

fid1 = H5Fopen(FILE_NAME_1, H5F_ACC_RDWR, H5P_DEFAULT);
fid2 = H5Fopen(FILE_NAME_2, H5F_ACC_RDWR, H5P_DEFAULT);
fid3 = H5Fcreate(FILE_NAME_ALL, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

gid = H5Gcreate2(fid3, "/G", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
H5Gclose(gid);

/*
* Mount second file under G in the first file.
*/
H5Fmount(fid3, "/G", fid1, H5P_DEFAULT);
H5Fmount(fid3, "/G", fid2, H5P_DEFAULT);

H5Fclose(fid1);
H5Fclose(fid2);
H5Fclose(fid3);

return 0;
}

当我使用 h5dump 查看 new.h5 时,我得到:

h5dump new.h5
HDF5 "new.h5" {
GROUP "/" {
GROUP "G" {
}
}
}

所以我创建了 G 组,但是里面没有文件?!出了什么问题?

是否可以在挂载文件时将第二个文件中的“dataset1”重命名为“dataset2”,还是我必须先这样做?

谢谢!

编辑:

我可能发现了一个问题:我想从根组挂载文件。我的意思是:我想要一个包含其他两个文件的所有内容的公共(public)文件。这使得很难找到安装点。它不能是根目录,但现有文件中没有名为“/G”的组。我该如何解决这个问题?

最佳答案

这是正确的行为。使用 H5Fmount 只会将文件挂载到内存中的那个位置。因此,当您关闭文件并退出程序时,新文件 (new.h5) 不会(也不会)显示已安装文件的内容。

如果您想要这种行为,请使用 H5Lcreate_external创建外部链接。

我已将您的代码更改为 C(不是 C++ - 抱歉,但思路是一样的):

#include <stdlib.h>
#include <stdio.h>
#include <hdf5.h>

#define FILE_NAME_1 "file1.h5"
#define FILE_NAME_2 "file2.h5"
#define FILE_NAME_ALL "new.h5"

int main(void)
{

hid_t fid1; /* Files identifier */

fid1 = H5Fcreate(FILE_NAME_ALL, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

/*
* Link "file1.h5" to group F1
*/
H5Lcreate_external(FILE_NAME_1, "/", fid1, "/F1", H5P_DEFAULT, H5P_DEFAULT);

/*
* Link "file2.h5" to group F2
*/
H5Lcreate_external(FILE_NAME_2, "/", fid1, "/F2", H5P_DEFAULT, H5P_DEFAULT);

H5Fclose(fid1);

return 0;
}

其中 file1.h5file2.h5 的内容对于测试用例是相同的:

h5dump file1.h5
HDF5 "file1.h5" {
GROUP "/" {
DATASET "D" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 4, 5 ) / ( 4, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 1, 2, 3, 4, 5,
(2,0): 2, 3, 4, 5, 6,
(3,0): 3, 4, 5, 6, 7
}
}
}
}

然后如果我们编译并运行测试程序:

h5cc -o test test.c && ./test

最后转储新文件:

h5dump new.h5
HDF5 "new.h5" {
GROUP "/" {
EXTERNAL_LINK "F1" {
TARGETFILE "file1.h5"
TARGETPATH "/"
GROUP "/" {
DATASET "D" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 4, 5 ) / ( 4, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 1, 2, 3, 4, 5,
(2,0): 2, 3, 4, 5, 6,
(3,0): 3, 4, 5, 6, 7
}
}
}
}
EXTERNAL_LINK "F2" {
TARGETFILE "file2.h5"
TARGETPATH "/"
GROUP "/" {
DATASET "D" {
DATATYPE H5T_STD_I32LE
DATASPACE SIMPLE { ( 4, 5 ) / ( 4, 5 ) }
DATA {
(0,0): 0, 1, 2, 3, 4,
(1,0): 1, 2, 3, 4, 5,
(2,0): 2, 3, 4, 5, 6,
(3,0): 3, 4, 5, 6, 7
}
}
}
}
}
}

关于c++ - HDF5挂载文件(带H5Fmount),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22814882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com