我想问一下如何以任意顺序读取输入行。换句话说:如何读取给定的输入行?我写了下一个测试程序:
program main
implicit integer*4(i-n)
dimension ind(6)
do i=1,6
ind(i)=6-i
end do
open(7,file='test.inp',status='old')
do i=0,5
call fseek(7,ind(i+1),0)
read(7,*) m
write(*,*) m
call fseek(7,0,0)
end do
end
test.inp包含:
1
2
3
4
5
6
我的输出是:
4
5
6
2
3
4
有什么问题?我希望
6
5
4
3
2
1
答案 0 :(得分:1)
对于文本文件,最简单的方法是使用空读取来推进行。这将读取使用nth
unit=iu
文件行
rewind(iu)
do i=1,n-1
read(iu,*)
enddo
read(iu,*)data
请注意,如果您正在从同一个文件中执行大量读取,则应考虑将整个文件读入字符数组,然后您可以非常简单地按索引访问行。
这是一个读取整个文件的例子:
implicit none
integer::iu=20,i,n,io
character(len=:),allocatable::line(:)
real::x,y
open(iu,file='filename')
n=0
do while(.true.) ! pass through once to count the lines
read(iu,*,iostat=io)
if(io.ne.0)exit
n=n+1
enddo
write(*,*)'lines in file=',n
!allocate the character array. Here I'm hard coding a max line length
!of 130 characters (that can be fixed if its a problem.)
allocate(character(130)::line(n))
rewind(iu)
!read in entire file
do i=1,n
read(iu,'(a)')line(i)
enddo
!now we can random access the lines using internal reads:
read(line(55),*)x,y
! ( obviously use whatever format you need on the read )
write(*,*)x,y
end
这样做的一个明显缺点是,您无法读取跨越多行的数据,就像您从文件中读取一样。
编辑:我的旧版本的gfortran不喜欢可分配的字符语法。 这有效:
character(len=130),allocatable::line(:)
...
allocate(line(n))