Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:
description
Transcript of Czytanie listy zmiennych według ich nazw: dyrektywa NAMELIST W części deklaracyjnej:
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.
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
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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ą.
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.
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.
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.
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.
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
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
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