2016-11-01 3 views
1

Ich möchte fragen, wie ich die Zeilen der Eingabe in beliebiger Reihenfolge lesen kann. Mit anderen Worten: Wie liest man eine bestimmte Zeile der Eingabe? Ich habe das nächste Testprogramm geschrieben:Wie liest man die Zeilen der Eingabe in beliebiger Reihenfolge?

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 

wo test.inp enthält:

1 
2 
3 
4 
5 
6 

Mein Ausgang gegeben ist:

4 
5 
6 
2 
3 
4 

Was ist das Problem? Ich würde erwarten, dass

6 
5 
4 
3 
2 
1 
+0

'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

Antwort

1

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

Plus one kann beckspace und zurückspulen wenn notwendig. –

Verwandte Themen