📄 read_sgy.for
字号:
program main
logical flag !卷头标志
character(20) filename_in !文件名
integer(2) trace_number,time_number,time_interval
real(4),allocatable:: record_(:,:) !存放读入的记录
write(*,*)'输入数据文件名'
read(*,*)filename_in
call pre_read_sgy(filename_in,trace_number,time_number,
& time_interval,flag)
allocate(record_(1:trace_number,1:time_number))
call read_sgy(filename_in,trace_number,time_number,
& record_,flag)
!输出文件信息
write(*,*)'文件信息:'
write(*,*)'是否有卷头: ',flag
write(*,*)'总道数: ',trace_number
write(*,*)'采样点数: ',time_number
write(*,*)'采样间隔: ',time_interval
endprogram
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!子程序pre_read_sgy预读入文件,判读是否有卷头,并读入记录信息
subroutine pre_read_sgy(file_name,trace_number,time_number,
& time_interval,flag)
logical flag !卷头标志
character(*) file_name !文件名
character(80) information !用来存放卷头信息
integer(1) temp !一个空变量,用来读文件长度是用
integer(4) file_size !存放文件字节数
integer(2) trace_number,time_number,time_interval
!读取文件字节数
open(11,file=file_name,form='binary',access='sequential')
file_size=0
do while(.not.eof(11))
read(11,end=100)temp
file_size=file_size+1
enddo
100 close(11)
!以假设的无卷头方式打开
call pre_read_n(file_name,file_size,trace_number,time_number,
& time_interval)
!write(*,*)trace_number,time_number,time_interval
if(trace_number.NE.0.AND.time_number.NE.0) then
if(real(file_size)/(trace_number*
& (time_number*4+240)).eq.1.0) then
!write(*,*)trace_number,time_number,time_interval
!write(*,*)real(real(file_size)/(trace_number*
!&(time_number*4+240)))
flag=.false. !无卷头,打开方式正确
!write(*,*)'调试1',file_size,flag
else
!否则以有卷头方式打开
!write(*,*)'调试2'
call pre_read_y(file_name,file_size,trace_number,time_number,
& time_interval)
!write(*,*)trace_number,time_number,time_interval
if(trace_number.NE.0.AND.time_number.NE.0) then
if((real(file_size-3600)/(trace_number*
& (time_number*4+240))).eq.1.0) then
flag=.true. !有卷头,打开方式正确
else
stop '读入出错,文件是否有卷头不能确定或可能有错!'
endif
else
stop '读入出错,文件是否有卷头不能确定或可能有错!'
endif
endif
else
!可能有卷头,试以有卷头方式打开
call pre_read_y(file_name,file_size,trace_number,time_number,
& time_interval)
!write(*,*)trace_number,time_number,time_interval
if(trace_number.NE.0.AND.time_number.NE.0) then
if((real(file_size-3600)/(trace_number*
& (time_number*4+240))).eq.1.0) then
flag=.true.
else
stop '读入出错,文件是否有卷头不能确定或可能有错!'
endif
else
stop '读入出错,文件是否有卷头不能确定或可能有错!'
endif
endif
endsubroutine pre_read_sgy
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!pre_read_y,用来被Pre_read_sgy调用,以有卷头打开文件
subroutine pre_read_y(file_name,file_size,trace_number,
& time_number,time_interval)
character(*) file_name !文件名
character(80) information !用来存放卷头信息
integer(2) temp !一个空变量,用来读文件长度是用
integer(4) file_size !存放文件字节数
integer(2) trace_number,time_number,time_interval
trace_number=0
time_number=0
time_interval=0
open(11,file=file_name,form='binary',access='sequential')
read(11)(information,i=1,40) !跳过3200字节文本
read(11)(temp,i=1,200) !跳过400字节数字(二进制)
read(11)(temp,i=1,57)!跳过114字节
read(11)time_number !读入采样点数
read(11)time_interval !读入采样间隔
close(11)
trace_number=(file_size-3600)/(time_number*4+240)!计算记录总道数
end subroutine pre_read_y
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!pre_read_n,用来被Pre_read_sgy调用,以无卷头打开文件
subroutine pre_read_n(file_name,file_size,trace_number,
& time_number,time_interval)
character(*) file_name !文件名
integer(2) temp !一个空变量,用来读文件长度是用
integer(4) file_size !存放文件字节数
integer(2) trace_number,time_number,time_interval
trace_number=0
time_number=0
time_interval=0
open(11,file=file_name,form='binary',access='sequential')
read(11)(temp,i=1,57)!跳过114字节
read(11)time_number !读入采样点数
read(11)time_interval !读入采样间隔
close(11)
trace_number=file_size/(time_number*4+240)!计算记录总道数
end subroutine pre_read_n
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!子程序read_sgy,正式读入记录数据
subroutine read_sgy(file_name,trace_number,time_number,
& record_,flag)
logical flag !卷头标志
character(*) file_name
character(80) information !用来存放卷头信息
integer(2) trace_number,time_number
real(4) record_(1:trace_number,1:time_number)!数据记录
real(4) temp !空变量,用来每次跳过4的字节
open(12,file=file_name,form='binary',access='sequential')
if(flag) then !判断是否有卷头
!读卷头,
read(12)(information,i=1,40) !跳过3200字节文本
!write(*,*)information
read(12)(temp,i=1,100) !跳过400字节数字(二进制)
endif
!读数据
do i=1,trace_number,1
read(12)(temp,j=1,22) !跳过72字节道头
read(12)(temp,j=1,38) !跳过152字节道头
read(12)(record_(i,j),j=1,time_number) !读入一道记录
enddo
close(12)
endsubroutine read_sgy
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -