如何以任意顺序读取输入的行?

时间:2016-11-01 11:30:44

标签: fortran

我想问一下如何以任意顺序读取输入行。换句话说:如何读取给定的输入行?我写了下一个测试程序:

  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

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))