fortran - 在 Fortran 中获取 HDF5 文件名的长度?

标签 fortran hdf5

我正在尝试获取 Fortran 中 HDF5 对象的文件名,但我事先不知道文件名的长度。 HDF5 文档说这可以通过将 NULL 传递给 h5fget_name 来完成:

If the length of the name, which determines the required value of size, is unknown, a preliminary H5Fget_name call can be made by setting name to NULL.

但是,目前还不清楚如何通过 Fortran 代码实现这一点。根据文档中的上述语言,类似这样的内容应该有效:

  function get_hdf5_filename(obj_id) result(filename)

    use hdf5
    use iso_c_binding, ONLY: c_null_ptr

    ! Arguments
    integer(HID_T), intent(in)::obj_id
        !! Handle of HDF5 object

    ! Result
    character(:), allocatable::filename

    integer(SIZE_T)::size = 0
        !! Length of filename

    integer::hdferr
        !! HDF5 error code

    call h5fget_name_f(obj_id, c_null_ptr, size, hdferr)

    allocate (character(size)::filename)

    call h5fget_name_f(obj_id, filename, size, hdferr)

  end function get_hdf5_filename

但是,gfortran 不会编译上述内容并给出类型不匹配错误:

Error: Type mismatch in argument 'buf' at (1); passed TYPE(c_ptr) to CHARACTER(1)

最佳答案

可以通过将文件名变量声明为指针并在初始调用 h5fget_name_f 之前将其置空来传递 null:

  function get_hdf5_filename(obj_id) result(filename)

    use hdf5
    use iso_c_binding, ONLY: c_null_ptr

    ! Arguments
    integer(HID_T), intent(in)::obj_id
        !! Handle of HDF5 object

    ! Result
    character(:), pointer::filename

    integer(SIZE_T)::size = 50
        !! Length of filename

    integer::hdferr
        !! HDF5 error code

    nullify(filename)

    call h5fget_name_f(obj_id, filename, size, hdferr)

    ! HDF5 needs one more character (probably for the null character terminating the string), so we allocate filename to length size+1
    allocate (character(size+1)::filename)

    call h5fget_name_f(obj_id, filename, size, hdferr)

    ! Remove last character from the returned string
    filename => filename(1:size)

  end function get_hdf5_filename

请注意,h5fget_name_f 在传递的字符串中需要一个额外的字符(可能是终止空字符),因此必须为名称指针分配比 size 参数中设置的值长一个字符的空间。可以通过使用数组切片语法将文件指针重定向到排除最后一个字符的子集来删除终止空值(上例中为 filename => filename(1:size))。

关于fortran - 在 Fortran 中获取 HDF5 文件名的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67976883/

相关文章:

python - 加载 : pickle or hdf5 in python 更快

python : Change datatype of hdf5 array

c++ - CLion "Instantiating an unknown structure without reference"但编译正常

c++ - 对 'd1mach_' 的 undefined reference

string - 将整数转换为字符串以在运行时创建输出文件名

oop - Fortran 容器类会自动调用包含对象的析构函数吗?

parallel-processing - 如何确保我的Fortran FORALL结构被并行化?

python - 有条件地将 HDF5 文件读取到 pandas DataFrame

Java hdf5 库安装

c++ - 求解 A x = 0 的 Lapack 例程