![Page 1: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/1.jpg)
Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST
W części deklaracyjnej:
NAMELIST /nazwa/ zmienna_1,zmienna_2,…,zmienna_n
Czytanie:
READ(wejście,nazwa_listy)
Zmienne na liście mogą być zmiennymi prostymi lub tablicami. W pliku wejściowym piszemy:
&nazwa_listy zmienna_1=wartość_1,…, zmienna_n=wartość_n &end
Dla zmiennych tablicowych można podać albo leksykograficznie elementy tablicy albo wybrane elementy, np.
A(1,1)=1.0,A(1,5)=4.0
Zmienna nie zaspecyfikowana na liście w pliku wejściowym przyjmuje wartość 0.
![Page 2: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/2.jpg)
Rekord – elementarna porcja informacji jaka może być przesyłana pomiędzy pamięcią operacyjną a urządzeniem zewnętrznym (klawiaturą, ekranem, drukarką, dyskiem, taśmą magnetyczną).
Rekordy specjalne: EOF (End Of File; znacznik końca pliku).
Typy rekordów:
rekordy zredagowane; mogą być zapisane na każdym nośniku; ostatni znak jest znakiem końca linii (EOL; End Of Line);
rekordy niezredagowane; nie mogą być czytane z klawiatury ani zapisane na ekran i drukarkę.
Dostęp do rekordów:
sekwencyjny (pliki na wszystkich nośnikach);
bezpośredni (tylko pliki dyskowe).
Obsługa wejścia/wyjścia (I/O) w FORTRANie
![Page 3: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/3.jpg)
Plik danych – uporządkowany zbiór rekordów danych jednakowego typu posiadający jednoznaczny identyfikator (np. nazwę w UNIXie).
Podział plików pod względem rodzaju komunikacji z pamięcią:
Pliki zewnętrzne (ogromna większość): pliki umieszczone na nośnikach zewnętrznych (dyskach, CD-ROMach, taśmach magnetycznych). W FORTRANie odwołujemy się do nich poprzez liczbę całkowitą lub *.
Pliki wewnętrzne: zmienne typu CHARACTER; w FORTRANie odwołujemy się do nich poprzez nazwę zmiennej.
W dawniejszych wersjach FORTRANu pliki wewnętrzne obsługiwały instrukcje ENCODE (pisanie) i DECODE (czytanie); począwszy od FORTRANu77 zwykłe instrukcje READ i WRITE.
![Page 4: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/4.jpg)
Przykład użycia zmiennej jako pliku wewnętrznego w celu konwersji liczby na łancuch tekstowy.
CHARACTER*4 LICZITER=111WRITE(LICZ,’(I4.4)’) ITER
Po wykonaniu tej operacji w zmiennej LICZ zostanie zapamiętany łańcuch 0111
![Page 5: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/5.jpg)
Typy i atrybuty plików w FORTRANie
Rodzaj pliku i atrybut formy
zapisu
Metoda dostępu i atrybut organizacji pliku
Sekwencyjna
‘SEQUENTIAL’
Bezpośrednia
‘DIRECT’
Plik formatowany ‘FORMATTED’
Plikiem jest sekwencja rekordów zredagowanych, z których każdy jest ciągiem znaków ASCII i jest zakończony znacznikiem końca pliku.
Dozwolone są rekordy o różnych długościach.
Wszystkie rekordy muszą być tej samej długości.
Plik nieformatowany
‘UNFORMTTED’
Plikiem jest sekwencja rekordów niezredagowanych, z których każdy jest ciągiem wartości w zapisie odpowiadającym wewnętrznej postaci dwójkowej.
Każdy rekord zawiera informację o swoim początku i końcu.
Rekordy są uzupełniane do stałej długości odpowiednią liczbą bajtów.
Plik dwójkowy ‘BINARY’
Plikiem jest ciąg bajtów bez wewnętrznej organizacji.
Plik zawiera porcje o stałej długości jednak bez ograniczenia co do liczby przesyłanych bajtów.
Pozycje odczytywanych danych w pliku muszą być ściśle zgodne z ich pozycjami w momencie zapisu.
![Page 6: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/6.jpg)
Instrukcje wejścia/wyjścia w FORTRANie
BACKSPACE Cofnięcie pliku sekwencyjnego o 1 rekord.
CLOSE Zamknięcie i odłączenie pliku.
ENDFILE Zapis rekordu końca zbioru.
INQUIRE Badanie stanu i właściwości urządzenia lub pliku.
LOCKING Kontrola dostępu do danych zawartych w zbiorach bezpośredniego dostępu (w warunkach jednoczesnego dostępu z wielu programów).
OPEN Przyłączenie do urządzenia i otwarcie pliku.
PRINTWyprowadzenie danych na standardowe urządzenie wyjścia (ekran).
READWprowadzenie danych ze standardowego urządzenia wejścia (klawiatura) lub z pliku.
REWIND Przewinięcie pliku do początku.
WRITE Zapis danych do pliku.
![Page 7: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/7.jpg)
Podstawowe argumenty instrukcji wejścia/wyjścia
Postaci argumentów Instrukcje I/O Wartości argumentów i uwagi
wzorzec_redagowania
FORMAT
READ
WRITE
Lista deskryptorów do redagowania plików formatowanych.
lista_I/O
READ
WRITE
Lista danych do wprowadzenia/wyprowadzenia
ACCESS=dostępINQUIRE
OPENMetoda dostępu: ‘SEQUENTIAL’ albo ‘DIRECT’.
END=etykieta READEtykieta do której należy skoczyć po napotkaniu znacznika końca pliku.
ERR=etykietaWszystkie oprócz PRINT
Etykieta do której należy skoczyć po wystąpieniu błędu.
![Page 8: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/8.jpg)
Postaci argumentów Instrukcje I/O Wartości argumentów i uwagi
FILE=plikINQUIRE
OPENNazwa pliku.
[FMT=]spec_formatu
READ
WRITE
* (format swobodny) lub specyfikacja formatu.
FORM=formaINQUIRE
OPEN
Rodzaj pliku: ‘FORMATTED’ (sformatowany; standard dla sekwencyjnych), ‘UNFORMATTED’ (standard dla bezp. dostępu) lub ‘BINARY’.
IOSTAT=testWszystkie oprócz PRINT
test jest zmienną całkowitej, której przypisywana jest wartość wynikająca z poprawnego lub błędnego zakończenia operacji.
![Page 9: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/9.jpg)
Postaci argumentów Instrukcje I/O Wartości argumentów i uwagi
REC=rekord
LOCKING
READ
WRITE
Numer rekordu do zapisu, odczytu lub “zamknięcia” w pliku bezpośredniego dostępu.
RECL=długość_rekorduINQUIRE
OPENDługość rekordu (w bajtach) w pliku o bezpośrednim dostępie.
STATUS=stanCLOSE
OPEN
Stan pliku, w OPEN: ‘OLD’, ‘NEW’, ‘SCRATCH’ lub ‘UNKNOWN’ (standard); w CLOSE: ‘KEEP’ lub ‘DELETE’.
[UNIT=]jedn_logWszystkie oprócz PRINT
Jednostka logiczna uczestnicząca w danej operacji I/O; jest to wyrażenie całkowite lub * (standardowe urządzenie wejścia/wyjścia); argument jest obowiązkowy.
![Page 10: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/10.jpg)
Identyfikatory logiczne (uchwyty) plików:
zmienna_tekstowa: tzw. plik wewnętrzny;
*: klawiatura (czytanie) lub ekran (pisanie);
0: STDERR (ekran) standardowe urządzenie na które są wyprowadzane komunikaty o błędach;
5: STDIN (klawiatura) standardowe urządzenie wejścia;
6: STDOUT (ekran lub drukarka) standardowe urządzenie wyjścia;
1-4, 7 i wyżej: plik o danym numerze urządzenia; zwykle oznacza plik dyskowy.
Pod numery 0, 5 i 6 można również podłączać pliki zewnętrzne; wtedy te urządzenia tracą swoje standardowe znaczenia.
![Page 11: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/11.jpg)
Otwieranie plików
Operacja otwierania przypisuje konkretny plik urządzeniu logicznemu. Standardowe urządzenia wejścia/wyjścia jest zawsze przypisywane identyfikatorowi *; tutaj nie wolno wykonywać instrukcji OPEN.
Domyślnie numery (uchwyty) 0, 5 i 6 są przypisywane odpowiednim urządzeniom standardowym.
Pozostałe numery (uchwyty) są domyślnie przypisywane plikom o nazwach o ogólnej postaci
fort.n
gdzie n jest numerem logicznym,
a plikom jest przypisywany status ‘UNKNOWN’.
Takie nazwy pojawią się po wykonaniu przez program pierwszej operacji na danym pliku różnej od instrukcji OPEN.
![Page 12: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/12.jpg)
Przykład: wykonanie instrukcji:
WRITE(1,*) “Ala ma kota”
jako pierwszej operacji na pliku o numerze 1 spowoduje pojawienie się pliku o nazwie fort.1 z takim tekstem.
Wykonanie instrukcji:
WRITE(6,*) “Ala ma kota”
Spowoduje wyprowadzenie tego tekstu na ekran.
![Page 13: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/13.jpg)
Instrukcja OPEN otwierania pliku i przypisywania mu numeru logicznego (uchwytu)
OPEN(nr_pliku[,FILE=nazwa_pliku][,FORM=forma][,ACCESS=acc][,ERR=etykieta])
Nazwy nie wolno nadawać plikom o statusie ‘SCRATCH’
Przykład:
OPEN(1,FILE=“ala.txt”,form=“FORMATTED”)
WRITE(1,*) “Ala ma kota”
Zostanie utworzony plik ala.txt zawierający podany tekst.
![Page 14: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/14.jpg)
Uwaga! Otwarcie pliku ze statusem ‘UNKNOWN’ powoduje, że pierwsza instrukcja WRITE niszczy poprzednią zawartość pliku. Jeżeli chcemy zachować poprzednią zawartość musimy zadeklarować ACCESS=‘APPEND’. Jest to rozszerzenie standardu FORTRANu 77 i dlatego przypisuje się ją różnym zmiennym I/O w zależności od implementacji; np. POSITION=‘APPEND’ na SGI.
Przykład: Niech plik alaias zawiera linę
Ala i As
Wykonanie sekwencji:
OPEN(1,FILE=‘alaias.txt’,status=‘UNKNOWN’,ACCESS=‘APPEND’)
WRITE(1,*) “Ala ma kota”
Spowoduje dodanie do pliku linii z podanym tekstem. W przeciwnym razie istniejąca zawartość zostałaby zastąpiona przez nową.
![Page 15: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/15.jpg)
CHARACTER*16 nazwa
10 PRINT ‘(A)’,”Podaj nazwe pliku z danymi”
READ(*,’(A)’) nazwa
OPEN(3,FILE=nazwa,STATUS=‘OLD’,ERR=10)
READ(3,*) X
Przykład wykorzystania parametru ERR w instrukcji OPEN
Ponieważ STATUS=‘OLD’, poprawne zakończenie instrukcji OPEN wymaga aby plik już istniał. Dlatego program będzie dotąd pytał o nazwę pliku aż podamy nazwę pliku istniejącego.
![Page 16: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/16.jpg)
Zamykanie pliku
CLOSE(nr_pliku [,STATUS=stat],[ERR=etykieta])
Przykład:
CLOSE(1)
Zamyka plik o numerze 1.
CLOSE(1,STATUS=‘DELETE’)
Zamyka i usuwa plik o numerze 1.
Pliki są zawsze domyślnie zamykane po poprawnym zakończeniu programu nawet jak nie wykonamy instrukcji CLOSE.
![Page 17: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/17.jpg)
Przykład programowej obsługi błędów mogących się pojawić przy czytaniu danych poprzez użycie zmiennych ERR i END:
READ(1,*,END=10,ERR=20) X GOTO 30
10 PRINT *,"Koniec danych" STOP
20 PRINT *,"Blad w danych" STOP
30 CONTINUE
W przypadku poprawnego przeczytania zmiennej X program przechodzi dalej; zatrzymuje się z odpowiednim komunikatem jeżeli wystąpił błąd przy czytaniu lub koniec danych.
![Page 18: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/18.jpg)
Przykład czytania i pisania nieformatowanego.
DOUBLE PRECISION A(100,100) ……C Zapisujemy zawartość macierzy A do pliku o przechowalnia.dat; macierz jest C zapisywana kolumnami i kazda kolumna stanowi 1 rekord.
OPEN(1,FILE=“przechowalnia.dat”,STATUS=“NEW”,&FORM=“UNFORMATTED”,ACCESS=“SEQUENTIAL”) WRITE(1) (A(1,I),I=1,100) CLOSE(1)
C Tablica A moze byc teraz wykorzystywana do innych celow a jej dotychczasowa C zawartosc jest przechowywana w pliku dyskowym. ……C Teraz chcemy zaladowac zapisana zawartosc macierzy A znowu na dysk. C Nalezy zwrocic uwage, ze dlugosc rekordow w instrukcji czytania musi byc takaC sama jak w instrukcji pisania, ktora zapisalismy tablice A do pliku,
OPEN(1,FILE=“przechowalnia.dat”,STATUS=“OLD”,&FORM=“UNFORMATTED”,ACCESS=“SEQUENTIAL”) READ(1) (A(1,I),I=1,100) CLOSE(1,STATUS=“DELETE”)
C Plik przechowalnia.dat zostal juz wykorzystany i wykasowany z dysku.
![Page 19: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/19.jpg)
Przykład wykorzystania plików bezpośredniego dostępu.
Przypuśćmy, że w pliku “katalog” znajdują się podstawowe dane o związkach chemicznych (nazwa, wzór sumaryczny) o kolejnych numerach katalogowych (numer katalogowy odpowiada numerowi linii) i plik jest na tyle duży, że nie można go wczytać do pamięci. Chcemy uzyskać informacje o związku o i-tym numerze katalogowym.
Program
Przykład pierwszych linii pliku
![Page 20: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/20.jpg)
Instrukcja INQUIRE
INQUIRE(ACCESS=acc,BLANK=blnk,DIRECT=dir,
EXIST=ex,FORM=forma,IOSTAT=ios,FILE=nazwa,
NAMED=nam,NEXTREC=numer,NUMBER=nr_pliku,
OPENED=op, RECL=długość,SEQUENTIAL=seq,
UNFORMATTED=unf, ERR=etykieta)
dir, form, seq, unf: ‘YES’, ‘NO’ albo ‘UNKNOWN’
blnk: ‘NULL’ albo ‘ZERO’
ex, nam, op: .TRUE. albo .FALSE.
ios, numer, nr_pliku, długość: INTEGER
nazwa: CHARACTER
![Page 21: Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:](https://reader036.vdocuments.site/reader036/viewer/2022062423/5681449b550346895db14796/html5/thumbnails/21.jpg)
Przykład: Sprawdzanie istnienia pliku o danej nazwie.
CHARACTER*16 nazwa
LOGICAL EX
READ(*,’(A)’) NAZWA
INQUIRE(FILE=nazwa,EXIST=ex)
IF (EX) THEN
PRINT *,“Plik “,nazwa,” istnieje”
ELSE
PRINT *,”Plik “,nazwa,” nie istnieje”
ENDIF