für eine Textdatei die einfachste Sache ist, verwenden Sie einfach eine leere lesen, um Zeilen vorzurücken. Dadurch wird die nth
Linie der Datei geöffnet mit unit=iu
rewind(iu)
do i=1,n-1
read(iu,*)
enddo
read(iu,*)data
Hinweis lesen, wenn Sie eine Menge tun, der aus der gleichen Datei liest man beachten sollte, die gesamte Datei in ein Zeichenfeld zu lesen, dann können Sie ganz einfach Zugriff Linien nach Index.
hier ein Beispiel in einer ganzen Datei zu lesen:
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
Ein offensichtlicher Nachteil ist, Sie keine Daten lesen können, die mehrere Zeilen das gleiche wie wenn Sie aus der Datei gelesen haben umspannt.
Edit: Meine alte Version von Gfortran mag nicht diese zuweisbare Zeichensyntax. Dies funktioniert:
character(len=130),allocatable::line(:)
...
allocate(line(n))
'fseek' die eine gfortran Erweiterung ist, scheint nicht richtig funktioniert mit formatiertem (Text-Dateien). Beachten Sie, dass es nach Byte-Positionen sucht, nicht nach Zeilen, aber selbst wenn sein Verhalten am besten als fehlerhaft und unsinnig beschrieben wird, wenn Sie 'fseek' mit formatierten Lesevorgängen mischen. – agentp