2012-04-21 14 views
5

Rozumiem, że Fortran, odczytując dane z pliku, pominie wiersze rozpoczynające się od i gwiazdkę (*), zakładając, że są komentarzem. Wydaje mi się, że mam problem z osiągnięciem tego zachowania za pomocą bardzo prostego programu, który stworzyłem. To jest mój prosty Fortran Program:Czytanie wierszy komentarza poprawnie w pliku wejściowym przy użyciu Fortran 90

1  program test 
    2 
    3  integer dat1 
    4 
    5  open(unit=1,file="file.inp") 
    6 
    7  read(1,*) dat1 
    8 
    9 
10  end program test 

to "file.inp":

1 *Hello 
    2 1 

zbudowałem mój prosty program z

gfortran -g -o test test.f90 

Kiedy biegnę, pojawia się błąd :

At line 7 of file test.f90 (unit = 1, file = 'file.inp') 
Fortran runtime error: Bad integer for item 1 in list input 

Po uruchomieniu pliku wejściowego wi z usuniętą linią komentarza, tj .:

1 1 

Kod działa poprawnie. Tak więc wydaje się, że jest to problem z prawidłowym interpretowaniem tej linii komentarza przez Fortran. To musi być coś niezwykle prostego, czego tu brakuje, ale nie mogę znaleźć niczego w google.

Odpowiedz

7

Fortran nie pomija automatycznie wierszy komentarzy w plikach wejściowych. Możesz to zrobić wystarczająco łatwo, najpierw czytając wiersz w łańcuchu, sprawdzając pierwszy znak dla symbolu komentarza lub przeszukując ciąg znaków dla tego symbolu, a następnie, jeśli linia nie jest komentarzem, wykonując "wewnętrzny odczyt" ciągu znaków, aby uzyskać wartość liczbową.

Coś jak:

use, intrinsic :: iso_fortran_env 

character (len=200) :: line 
integer :: dat1, RetCode 

read_loop: do 
    read (1, '(A)', isostat=RetCode) line 
    if (RetCode == iostat_end) exit ReadLoop 
    if (RetCode /= 0) then 
     ... read error 
     exit ReadLoop 
    end if 
    if (index (line, "*") /= 0) cycle read_loop 
    read (line, *) dat1 
end do read_loop 
+0

Tak, właśnie to wymyśliłem i wróciłem, aby opublikować moje rozwiązanie. Jednak twój kod jest nieco mądrzejszy niż rozwiązanie, które wymyśliłem (używałem opcji "end =" dla mojego odczytu). Jedną z rzeczy, których nie rozumiem, jest potrzeba używania "iso_fortran_env"? Przepraszam, napisałem kilka dużych programów Fortran i sprawiłem, że działają, ale jestem trochę noob, jeśli chodzi o wewnętrzne moduły i to, co przynoszą do stołu. – rks171

+2

Między innymi iso_fortran_env udostępnia wartość "isostat_end", aby sprawdzić, czy niezerowy kod powrotu jest końcem pliku. Pozwala to na użycie konstruktu "exit" zamiast etykiet instrukcji, jak w przypadku "end = LineNumber". –

0

Fortran nie pomija niczego domyślnie, chyba że używasz namelists iw tym przypadku komentarze zacząć z wykrzyknikiem.