Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałAugustyn Rachwalski Został zmieniony 10 lat temu
1
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.
2
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
3
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.
4
Przykład użycia zmiennej jako pliku wewnętrznego w celu konwersji liczby na łancuch tekstowy. CHARACTER*4 LICZ ITER=111 WRITE(LICZ,(I4.4)) ITER Po wykonaniu tej operacji w zmiennej LICZ zostanie zapamiętany łańcuch 0111
5
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.
6
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. PRINT Wyprowadzenie danych na standardowe urządzenie wyjścia (ekran). READ Wprowadzenie danych ze standardowego urządzenia wejścia (klawiatura) lub z pliku. REWIND Przewinięcie pliku do początku. WRITE Zapis danych do pliku.
7
Podstawowe argumenty instrukcji wejścia/wyjścia Postaci argumentówInstrukcje I/OWartości argumentów i uwagi wzorzec_redagowania FORMAT PRINT READ WRITE Lista deskryptorów do redagowania plików formatowanych. lista_I/O PRINT READ WRITE Lista danych do wprowadzenia/wyprowadzenia ACCESS=dostęp INQUIRE OPEN Metoda dostępu: SEQUENTIAL albo DIRECT. END=etykietaREAD Etykieta do której należy skoczyć po napotkaniu znacznika końca pliku. ERR=etykieta Wszystkie oprócz PRINT Etykieta do której należy skoczyć po wystąpieniu błędu.
8
Postaci argumentówInstrukcje I/OWartości argumentów i uwagi FILE=plik INQUIRE OPEN Nazwa pliku. [FMT=]spec_formatu PRINT READ WRITE * (format swobodny) lub specyfikacja formatu. FORM=forma INQUIRE OPEN Rodzaj pliku: FORMATTED (sformatowany; standard dla sekwencyjnych), UNFORMATTED (standard dla bezp. dostępu) lub BINARY. IOSTAT=test Wszystkie oprócz PRINT test jest zmienną całkowitej, której przypisywana jest wartość wynikająca z poprawnego lub błędnego zakończenia operacji.
9
Postaci argumentówInstrukcje I/OWartoś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ść_rekordu INQUIRE OPEN Długość rekordu (w bajtach) w pliku o bezpośrednim dostępie. STATUS=stan CLOSE OPEN Stan pliku, w OPEN: OLD, NEW, SCRATCH lub UNKNOWN (standard); w CLOSE: KEEP lub DELETE. [UNIT=]jedn_log Wszystkie 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.
10
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.
11
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.
12
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.
13
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.
14
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ą.
15
CHARACTER*16 nazwa 10PRINT (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.
16
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.
17
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.
18
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 taka C 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.
19
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
20
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
21
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
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.