Fortran - wyjście pliku wejściowego
Fortran umożliwia odczytywanie i zapisywanie danych w plikach.
W ostatnim rozdziale widziałeś, jak odczytywać i zapisywać dane w terminalu. W tym rozdziale zapoznasz się z funkcjami wprowadzania i wyprowadzania plików udostępnianymi przez Fortran.
Możesz czytać i zapisywać w jednym lub wielu plikach. Instrukcje OPEN, WRITE, READ i CLOSE pozwalają to osiągnąć.
Otwieranie i zamykanie plików
Przed użyciem pliku należy go otworzyć. PlikopenPolecenie służy do otwierania plików do odczytu lub zapisu. Najprostszą formą polecenia jest -
open (unit = number, file = "name").
Jednak otwarte oświadczenie może mieć ogólną formę -
open (list-of-specifiers)
W poniższej tabeli opisano najczęściej używane specyfikatory -
Sr.No | Specyfikator i opis |
---|---|
1 | [UNIT=] u Numer jednostki u może być dowolną liczbą z zakresu 9-99 i wskazuje plik, możesz wybrać dowolną liczbę, ale każdy otwarty plik w programie musi mieć unikalny numer |
2 | IOSTAT= ios Jest to identyfikator stanu We / Wy i powinien być zmienną całkowitą. Jeśli instrukcja open powiedzie się, zwrócona wartość ios jest równa zero, w przeciwnym razie jest wartością niezerową. |
3 | ERR = err Jest to etykieta, do której sterowanie przechodzi w przypadku jakiegokolwiek błędu. |
4 | FILE = fname Nazwa pliku, ciąg znaków. |
5 | STATUS = sta Pokazuje poprzedni stan pliku. Ciąg znaków i może mieć jedną z trzech wartości NOWY, STARY lub SCRATCH. Plik magazynowy jest tworzony i usuwany po zamknięciu lub zakończeniu programu. |
6 | ACCESS = acc Jest to tryb dostępu do plików. Może mieć jedną z dwóch wartości: SEQUENTIAL lub DIRECT. Wartość domyślna to SEKWENCYJNA. |
7 | FORM = frm Podaje stan formatowania pliku. Może mieć jedną z dwóch wartości FORMATTED lub UNFORMATTED. Wartość domyślna to UNFORMATTED |
8 | RECL = rl Określa długość każdego rekordu w pliku o bezpośrednim dostępie. |
Po otwarciu pliku uzyskuje się do niego dostęp za pomocą instrukcji odczytu i zapisu. Po zakończeniu należy go zamknąć za pomocąclose komunikat.
Instrukcja close ma następującą składnię -
close ([UNIT = ]u[,IOSTAT = ios,ERR = err,STATUS = sta])
Należy pamiętać, że parametry w nawiasach są opcjonalne.
Example
Ten przykład demonstruje otwieranie nowego pliku do zapisywania niektórych danych w pliku.
program outputdata
implicit none
real, dimension(100) :: x, y
real, dimension(100) :: p, q
integer :: i
! data
do i=1,100
x(i) = i * 0.1
y(i) = sin(x(i)) * (1-cos(x(i)/3.0))
end do
! output data into a file
open(1, file = 'data1.dat', status = 'new')
do i=1,100
write(1,*) x(i), y(i)
end do
close(1)
end program outputdata
Kiedy powyższy kod jest kompilowany i wykonywany, tworzy plik data1.dat i zapisuje w nim wartości tablicy x i y. A następnie zamyka plik.
Czytanie zi zapisywanie do pliku
Instrukcje odczytu i zapisu są używane odpowiednio do odczytu i zapisu do pliku.
Mają następującą składnię -
read ([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
write([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
Większość specyfikatorów została już omówiona w powyższej tabeli.
Specyfikator END = s jest etykietą instrukcji, do której program przeskakuje, gdy osiągnie koniec pliku.
Example
Ten przykład ilustruje odczytywanie zi zapisywanie do pliku.
W tym programie czytamy z pliku, który stworzyliśmy w ostatnim przykładzie data1.dat i wyświetlamy go na ekranie.
program outputdata
implicit none
real, dimension(100) :: x, y
real, dimension(100) :: p, q
integer :: i
! data
do i = 1,100
x(i) = i * 0.1
y(i) = sin(x(i)) * (1-cos(x(i)/3.0))
end do
! output data into a file
open(1, file = 'data1.dat', status='new')
do i = 1,100
write(1,*) x(i), y(i)
end do
close(1)
! opening the file for reading
open (2, file = 'data1.dat', status = 'old')
do i = 1,100
read(2,*) p(i), q(i)
end do
close(2)
do i = 1,100
write(*,*) p(i), q(i)
end do
end program outputdata
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
0.100000001 5.54589933E-05
0.200000003 4.41325130E-04
0.300000012 1.47636665E-03
0.400000006 3.45637114E-03
0.500000000 6.64328877E-03
0.600000024 1.12552457E-02
0.699999988 1.74576249E-02
0.800000012 2.53552198E-02
0.900000036 3.49861123E-02
1.00000000 4.63171229E-02
1.10000002 5.92407547E-02
1.20000005 7.35742599E-02
1.30000007 8.90605897E-02
1.39999998 0.105371222
1.50000000 0.122110792
1.60000002 0.138823599
1.70000005 0.155002072
1.80000007 0.170096487
1.89999998 0.183526158
2.00000000 0.194692180
2.10000014 0.202990443
2.20000005 0.207826138
2.29999995 0.208628103
2.40000010 0.204863414
2.50000000 0.196052119
2.60000014 0.181780845
2.70000005 0.161716297
2.79999995 0.135617107
2.90000010 0.103344671
3.00000000 6.48725405E-02
3.10000014 2.02930309E-02
3.20000005 -3.01767997E-02
3.29999995 -8.61928314E-02
3.40000010 -0.147283033
3.50000000 -0.212848678
3.60000014 -0.282169819
3.70000005 -0.354410470
3.79999995 -0.428629100
3.90000010 -0.503789663
4.00000000 -0.578774154
4.09999990 -0.652400017
4.20000029 -0.723436713
4.30000019 -0.790623367
4.40000010 -0.852691114
4.50000000 -0.908382416
4.59999990 -0.956472993
4.70000029 -0.995793998
4.80000019 -1.02525222
4.90000010 -1.04385209
5.00000000 -1.05071592
5.09999990 -1.04510069
5.20000029 -1.02641726
5.30000019 -0.994243503
5.40000010 -0.948338211
5.50000000 -0.888650239
5.59999990 -0.815326691
5.70000029 -0.728716135
5.80000019 -0.629372001
5.90000010 -0.518047631
6.00000000 -0.395693362
6.09999990 -0.263447165
6.20000029 -0.122622721
6.30000019 2.53026206E-02
6.40000010 0.178709000
6.50000000 0.335851669
6.59999990 0.494883657
6.70000029 0.653881252
6.80000019 0.810866773
6.90000010 0.963840425
7.00000000 1.11080539
7.09999990 1.24979746
7.20000029 1.37891412
7.30000019 1.49633956
7.40000010 1.60037732
7.50000000 1.68947268
7.59999990 1.76223695
7.70000029 1.81747139
7.80000019 1.85418403
7.90000010 1.87160957
8.00000000 1.86922085
8.10000038 1.84674001
8.19999981 1.80414569
8.30000019 1.74167395
8.40000057 1.65982044
8.50000000 1.55933595
8.60000038 1.44121361
8.69999981 1.30668485
8.80000019 1.15719533
8.90000057 0.994394958
9.00000000 0.820112705
9.10000038 0.636327863
9.19999981 0.445154816
9.30000019 0.248800844
9.40000057 4.95488606E-02
9.50000000 -0.150278628
9.60000038 -0.348357052
9.69999981 -0.542378068
9.80000019 -0.730095863
9.90000057 -0.909344316
10.0000000 -1.07807255