MST

星途 面试题库

面试题:Fortran复杂文件输入输出处理

给定一个包含混合数据类型(整数、实数、字符串)的二进制文件,数据以特定格式存储(例如:先4字节整数,接着8字节实数,然后是不定长字符串,字符串长度存放在前2字节)。编写Fortran程序,读取这个二进制文件,解析其中的数据,并将不同类型的数据分别存储到不同数组中。详细说明如何处理文件指针移动、数据类型匹配以及字符串长度解析等问题,给出核心代码片段并解释思路。
17.1万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 文件打开:使用OPEN语句打开二进制文件,指定合适的访问模式和状态。
  2. 文件指针移动:由于数据存储格式固定,每读取一种数据类型后,根据其字节数移动文件指针。例如读取4字节整数后,文件指针向后移动4字节准备读取下一个数据。
  3. 数据类型匹配:在READ语句中指定正确的数据类型,确保能正确读取数据。
  4. 字符串长度解析:先读取前2字节获取字符串长度,再根据此长度读取字符串。

核心代码片段

program read_binary_file
    implicit none
    integer :: iunit, ios, int_val, str_len
    real(8) :: real_val
    character(len=:), allocatable :: str_val
    integer, dimension(:), allocatable :: int_array
    real(8), dimension(:), allocatable :: real_array
    character(len=:), dimension(:), allocatable :: str_array
    integer :: num_entries, i

    num_entries = 10 ! 假设文件中有10组数据
    allocate(int_array(num_entries), real_array(num_entries), str_array(num_entries))

    iunit = 10
    open(unit = iunit, file = 'binary_file.bin', access = 'stream', form = 'unformatted', status = 'old', iostat = ios)
    if (ios /= 0) then
        print *, '无法打开文件'
        stop
    end if

    do i = 1, num_entries
        read(unit = iunit, iostat = ios) int_val
        if (ios /= 0) exit
        int_array(i) = int_val

        read(unit = iunit, iostat = ios) real_val
        if (ios /= 0) exit
        real_array(i) = real_val

        read(unit = iunit, iostat = ios) str_len
        if (ios /= 0) exit
        allocate(character(len=str_len) :: str_val)
        read(unit = iunit, iostat = ios) str_val
        if (ios /= 0) exit
        str_array(i) = str_val
    end do

    close(unit = iunit)

    ! 打印结果,用于验证
    do i = 1, size(int_array)
        print *, '整数: ', int_array(i)
        print *, '实数: ', real_array(i)
        print *, '字符串: ', str_array(i)
    end do

    deallocate(int_array, real_array, str_array)
end program read_binary_file

代码解释

  1. 变量声明:声明了文件单元号iunit、文件操作状态ios,以及存储整数、实数、字符串的变量和数组。
  2. 数组分配:根据假设的文件数据组数num_entries,分配存储不同类型数据的数组。
  3. 文件打开:使用OPEN语句以stream访问模式打开二进制文件,检查打开是否成功。
  4. 数据读取循环
    • 每次循环读取一个整数,存储到int_array中。
    • 接着读取一个实数,存储到real_array中。
    • 先读取2字节获取字符串长度str_len,动态分配字符串变量str_val,再读取字符串并存储到str_array中。
  5. 文件关闭:读取完数据后关闭文件。
  6. 结果验证:通过打印不同数组中的数据验证读取结果。
  7. 内存释放:使用DEALLOCATE释放动态分配的数组。