思路
- 文件打开:使用
OPEN
语句打开二进制文件,指定合适的访问模式和状态。
- 文件指针移动:由于数据存储格式固定,每读取一种数据类型后,根据其字节数移动文件指针。例如读取4字节整数后,文件指针向后移动4字节准备读取下一个数据。
- 数据类型匹配:在
READ
语句中指定正确的数据类型,确保能正确读取数据。
- 字符串长度解析:先读取前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
代码解释
- 变量声明:声明了文件单元号
iunit
、文件操作状态ios
,以及存储整数、实数、字符串的变量和数组。
- 数组分配:根据假设的文件数据组数
num_entries
,分配存储不同类型数据的数组。
- 文件打开:使用
OPEN
语句以stream
访问模式打开二进制文件,检查打开是否成功。
- 数据读取循环:
- 每次循环读取一个整数,存储到
int_array
中。
- 接着读取一个实数,存储到
real_array
中。
- 先读取2字节获取字符串长度
str_len
,动态分配字符串变量str_val
,再读取字符串并存储到str_array
中。
- 文件关闭:读取完数据后关闭文件。
- 结果验证:通过打印不同数组中的数据验证读取结果。
- 内存释放:使用
DEALLOCATE
释放动态分配的数组。