wejscie wyjscie


Operacje wejścia/wyjścia 1
Operacje wejścia/wyjścia
Instrukcje wejścia i wyjścia umożliwiają przekazywanie informacji między komputerem a
użytkownikiem programu. Pozwalają określić odpowiedz na trzy pytania:
·ð CO?
lista wejścia: zmienne; kolejne zmienne są oddzielane przecinkiem;
lista wyjścia: zmienne lub stae ; kolejne elementy listy są oddzielane przecinkiem;
·ð SKD / DOKD?
urządzenie standardowe symbolizowane gwiazdką: wejście - klawiatura, wyjście - monitor.
plik
plik wewnętrzny (zmienna tekstowa)
·ð W JAKI SPOSÓB?
format: gwiazdka symbolizuje tzw. format swobodny. W przypadku instrukcji READ jest to
najczęściej wystarczające i najwygodniejsze. W przypadku instrukcji WRITE (lub PRINT)
osiągnięcie czytelnego i przejrzystego wydruku często wymaga zastosowania redagowania
formatowanego.
·ð CO?
lista wejścia: zmienne; kolejne zmienne są oddzielane przecinkiem;
lista wyjścia: zmienne lub stae ; kolejne elementy listy są oddzielane przecinkiem;
Przykłady:
READ(*,*) a,b,c
READ(*,*) n, (x(i),i=1,n)
READ(*,*) (x(i), y(i), i=1,n)
READ(*,*) a(1,:)
WRITE(*,*) 'wartosc ',125
WRITE(*,*) a,b,c
WRITE(*,*) (i, x(i), y(i), i=1,n)
WRITE(*,*) 'Suma elementow z przekatnej: ',sum
·ð W JAKI SPOSÓB? - Formaty
Redagowanie formatowane może być stosowane zarówno w odniesieniu do instrukcji wejścia
jak i wyjścia. Tu omówimy instrukcję wyjścia (WRITE lub PRINT) z uwagi na fakt, że czytanie
najczęściej odbywa się z wykorzystaniem formatu swobodnego. Większość informacji jest
aktualna również w odniesieniu do instrukcji READ.
Redagowanie formatowane umożliwia ścisłe zdefiniowanie postaci (liczba znaków, liczba
znaków po kropce dziesiętnej, itd.) wyprowadzanych wartości. Definiowanie odbywa się
poprzez wskazanie w instrukcji wyjścia wzorca redagowania.
Wskazanie wzorca redagowania
Wskazanie wzorca redagowania może nastąpić poprzez:
·ð Umieszczenie wzorca redagowania ujÄ™tego w apostrofy ' lub '' w instrukcji WRITE
ewentualnie poprzedzonego słowem kluczowym FMT=:
WRITE (*,'(wzorzec redagowania)') .....
WRITE (*,FMT='(wzorzec redagowania)') .....
·ð Wykorzystanie zmiennej tekstowej, której wartoÅ›ciÄ… jest wzorzec redagowania:
CHARACTER (LEN=80):: WZORZEC
CHARACTER (LEN=30), PARAMETER:: WZOR='(wzorzec redagowania)'
......
WZORZEC='(wzorzec redagowania)'
Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16
Operacje wejścia/wyjścia 2
.....
WRITE(*,WZORZEC) ......
PRINT WZOR, .......
·ð Wykorzystanie etykiety, takiej samej, jakÄ… opatrzona jest specyfikacja FORMAT, definiujÄ…ca
wzorzec redagowania:
WRITE(*,20)....
PRINT 30,.....
20 FORMAT (wzorzec redagowania)
.....
30 FORMAT (wzorzec redagowania)
Uwagi:
·ð Specyfikacja FORMAT może wystÄ…pić w dowolnym miejscu programu.
·ð Do tej samej specyfikacji FORMAT może odnosić siÄ™ dowolna liczba instrukcji
wejścia/wyjścia.
·ð Szczególnym przypadkiem wzorca redagowania jest gwiazdka *, oznaczajÄ…ca format
swobodny.
Wzorzec redagowania
Wzorzec redagowania definiuje budowÄ™ rekordu. Rekordem nazywa siÄ™ pewnÄ… elementarnÄ…
porcję informacji. W przypadku instrukcji wyjścia rekord odpowiada jednemu wierszowi
wydruku. Wzorzec redagowania jest ściśle powiązany z listą wyjścia - i połączenie tych
elementów określa postać rekordu wyjściowego. Wzorzec redagowania może zawierać:
·ð opisy pól danych
·ð opisy pomocnicze
·ð opisy grupowe
Kolejne elementy wzorca redagowania sÄ… oddzielane przecinkami.
Opisy pól danych
Opis pola zawiera informację o typie wyprowadzanej wartości, długości zajmowanego przez
nią pola oraz sposobie zapisu. Poniżej będą wykorzystane następujące oznaczenia:
w całkowita długość pola
d liczba cyfr części ułamkowej liczby
m minimalna liczba wypisanych cyfr
e liczba cyfr wykładnika
r liczba powtórzeń opisu pola we wzorcu
wartości INTEGER
rIw, rIw.m
wartości REAL
rFw.d
rEw.d oraz rEw.dEe
wartości CHARACTER
rA lub rAw
wartości LOGICAL
rLw
Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16
Operacje wejścia/wyjścia 3
Uwagi:
·ð JeÅ›li caÅ‚kowita dÅ‚ugość pola jest niewystarczajÄ…ca, to wtedy wartoÅ›ci liczbowe nie zostanÄ…
wypisane (zamiast liczby pojawią się gwiazdki), natomiast wartości tekstowe zostaną
obcięte.
·ð Część uÅ‚amkowa liczby zostanie zaokrÄ…glona do dokÅ‚adnoÅ›ci zadanej poprzez wartość d.
·ð JeÅ›li caÅ‚kowita dÅ‚ugość pola jest dÅ‚uższa w porównaniu z dÅ‚ugoÅ›ciÄ… zajmowanÄ… przez
wypisywaną wartość, to następuje wyrównanie do prawej strony.
Przykład:
program formaty
implicit none
integer::i=-123, j=123
real::a=1.123
double precision:: d=12.d1
character (len=3)::ala='ALA'
!
write(*,'(i5,1x,i6.5)') i,i
! -123 -00123
write(*,'(i2)') i ! zbyt krotki opis pola
! **
write(*,'(2i5)') i, j
! -123 123
write(*,'(f6.2, f8.4, e11.4, e12.2e4)')a,a,a,a
! 1.12 1.1230 0.1123E+01 0.11E+0001
write(*,'(f6.2, f8.4, e11.4, e12.2e4)')d,d,d,d
! 120.00120.0000 0.1200E+03 0.12E+0003
write(*,'(a)') ala !liczba znakow zgodna z dlugoscia wypisywanej wartosci
! ALA
write(*,'(a10)') ala
! ALA
write(*,'(a2)') ala
! AL
end program formaty
Uwagi:
·ð Elementy listy wyjÅ›cia sÄ… kojarzone z kolejnymi opisami pól we wzorcu redagowania.
Wymagana jest zgodność typów elementów listy wyjścia i typów opisów pól. Brak
zgodności powoduje wystąpienie błędu wykonania programu i przerwanie jego działania.
·ð Istotne sÄ… relacje miÄ™dzy caÅ‚kowitÄ… dÅ‚ugoÅ›ciÄ… pola w a liczbÄ… znaków przeznaczonych na
reprezentację części ułamkowej liczby lub mantysy d. Należy również uwzględnić miejsce
na kropkę dziesiętną oraz znak minus. W związku z tym:
w opisie pola Fw.d: w-d>2
w opisie pola Ew.d: w-d>6 (wykładnik zajmuje 4 pozycje, plus znak na kropkę
dziesiętną, zero oraz znak minus)
·ð Liczby wypisywane zgodnie z opisem Ew.d sÄ… przeksztaÅ‚cane do postaci Ä…0.ddddÏð10n, bez
względu na oryginalną postać.
Opisy pomocnicze
Opisy pomocnicze zawierajÄ… dodatkowe informacje o strukturze rekordu. Nic nie zostaje
wypisane, ale zmienione zostaje położenie, w którym zostanie wypisany kolejny element
rekordu.
nX wstawienie n odstępów (spacji)
'zzz' wypisanie ciągu znaków (stałej tekstowej)
Tc przemieszczenie do pozycji c
TLc przemieszczenie o c pozycje w lewo
Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16
Operacje wejścia/wyjścia 4
TRc przemieszczenie o c pozycje w prawo
/ przejście do nowego wiersza. Opisy występujące po znaku / są realizowane w kolejnym
wierszu wydruku.
Przykład:
write(*,'(T10,a,T6,a)') 'AAA','BBB'
! BBB AAA
! warto porównać kolejność!
write(*,'(a,3x,a,5x,'koniec') 'AAA','BBB'
! AAA BBB koniec
Opisy grupowe
Dowolny ciąg opisów pól i opisów pomocniczych może zostać ujęty w nawiasy oraz
dodatkowo poprzedzony stałą całkowitą, której wartość definiuje liczbę kolejnych powtórzeń
wzorca ujętego w nawiasy.
Liczba opisów pól we wzorcu a liczba elementów w liście wyjścia
·ð Nie wymaga siÄ™ aby liczba elementów listy wyjÅ›cia byÅ‚a taka sama jak liczba opisów pól we
wzorcu redagowania.
·ð JeÅ›li liczba elementów listy wyjÅ›cia jest mniejsza od liczby opisów pól to proces
wypisywania jest kontynuowany aż do wyczerpania listy wyjścia. Jeśli między ostatnim
wykorzystanym opisem pola a opisem, dla którego 'zabraknie' elementu listy wyjścia
znajdujÄ… siÄ™ opisy pomocnicze, to zostanÄ… one zinterpretowane.
·ð JeÅ›li liczba elementów listy wyjÅ›cia jest wiÄ™ksza od liczby opisów pól (wzorzec jest 'za
krótki'), to po wykorzystaniu wszystkich opisów znajdujących się we wzorcu następuje:
-Przejście do kolejnego wiersza wydruku;
-Wypisywanie kolejnych elementów listy wyjścia według zasady:
- Jeśli we wzorcu formatu nie występują opisy grupowe, to wzorzec jest
interpretowany od poczÄ…tku.
- Jeśli we wzorcu występują opisy grupowe, to wzorzec jest interpretowany tylko
według tego opisu grupowego, którego nawias zamykający znajduje się najbardziej z
prawej strony. Ewentualne powtórzenia opisu grupowego są również uwzględnione.
Przykład:
program formaty
implicit none
integer::i
integer,dimension(15):: a=(/(i,i=1,15)/)
write (*,20) (a(i),i=1,15)
20 format(2(2x,i3),3x,'***',2(2x,'*',i4))
end program formaty
Wynik działania programu:
1 2 *** * 3 * 4
* 5 * 6
* 7 * 8
* 9 * 10
* 11 * 12
* 13 * 14
* 15 *
Uwaga:
We wzorcu redagowania nie mogą wystąpić zmienne. Natomiast można 'dynamicznie' tworzyć
wzorce formatu poprzez generowanie zmiennych tekstowych, o wartościach wykorzystywanych
jako wzorce formatu.
Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16
Operacje wejścia/wyjścia 5
·ð SKD / DOKD?
Określenie skąd będą wczytywane dane oraz dokąd będą wypisywane wyniki odbywa się
poprzez zdefiniowanie urzd zenia logicznego (ang. logical unit). UrzÄ…dzenia sÄ… oznaczane za
pomocą liczb dodatnich z przedziału od 1 do (najczęściej) 100, przy czym górna wartość zależy
od kompilatora.
READ([UNIT=] urzÄ…dzenie, [FMT=] wzorzec redagowania) .....
WRITE([UNIT=] urzÄ…dzenie, [FMT=] wzorzec redagowania) .....
W praktyce urzÄ…dzenie oznacza:
·ð urzÄ…dzenie standardowe symbolizowane gwiazdkÄ… *: wejÅ›cie - klawiatura, wyjÅ›cie -
monitor.
READ(UNIT=*,*) ....
READ(*,*)....
Szczególna postać instrukcji READ czytającej z klawiatury:
READ wzorzec formatu, ....
Analogicznie:
WRITE(UNIT=*,*) ....
WRITE(*,*)....
Szczególna postać instrukcji wypisującej na monitor:
PRINT wzorzec formatu, ....
·ð plik
Odwołanie się do pliku w instrukcji READ lub WRITE wymaga 'otwarcia pliku' poprzez
zastosowania instrukcji OPEN. Instrukcja OPEN służy to 'podłączenia' konkretnego pliku do
urzÄ…dzenia logicznego.
OPEN([UNIT=] numer urzÄ…dzenia, FILE=nazwa pliku)
Przykład:
....
OPEN(10, FILE='DANE.DAT')
OPEN(15,FILE='WYNIKI')
READ(10,*) A, B, C
READ(10,*) D,E,F
CLOSE(10)
....
WRITE(15,*) 'Wyniki'
....
CLOSE(15)
Uwaga:
·ð Podczas wykonywania programu może być otwartych w tym samym czasie wiele plików,
ale z danym urządzeniem logicznym może być powiązany tylko jeden plik.
·ð nazwa pliku to staÅ‚a lub zmienna tekstowa. Zmienna tekstowa umożliwia dynamiczne
definiowanie pliku podczas działania programu.
·ð 'ZamkniÄ™cie' pliku i 'zwolnienie' urzÄ…dzenia logicznego nastÄ™puje w wyniku wykonania
instrukcji:
CLOSE (numer urzÄ…dzenia)
·ð Zawartość pliku z danymi musi być 'zgodna' z instrukcjami z niego czytajÄ…cymi. Na
przykład w powyższym przykładzie wartość odpowiadająca zmiennej d musi znajdować się
w innym (kolejnym) wierszu niż rekord, w którym znajduje się zmienna c.
Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16
Operacje wejścia/wyjścia 6
·ð plik wewnÄ™trzny (zmienna tekstowa)
Jako urządzenie w instrukcjach READ oraz WRITE mogą wystąpić zmienne tekstowe. Umożliwia
to 'przepisanie' wartości liczbowych na zmienne tekstowe i odwrotnie, co niekiedy jest bardzo
pożyteczne. Wystarczy przypomnieć skomplikowane czynności programistyczne służące do
przedstawienia stałej tekstowej '1234' (na przykład) jako liczby. Wykorzystanie plików
wewnętrznych ułatwia dynamiczne generowanie wzorców formatów oraz nazw plików
zawierających liczby, bowiem w obydwu przypadkach niezbędna jest konwersja wartości
liczbowych na teksty.
Przykład:
program plik_wewnetrzny
implicit none
character (len=5):: tekst='12345'
character (len=80):: bufor
integer :: liczba
write (unit=*,FMT=*) 'tekst: ',tekst
read (tekst,*) liczba
write(*,*) 'to juz jest liczba: ',liczba,liczba/2
liczba=liczba/2
write(bufor,*) liczba
write(*,*) 'a to jest tekst ',bufor
end program plik_wewnetrzny
Wyniki działania programu:
tekst: 12345
to juz jest liczba: 12345 6172
a to jest tekst 6172
Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16
Operacje wejścia/wyjścia 7
Więcej o...
Zarówno instrukcje READ i WRITE, jak i instrukcja OPEN, dysponują dużą liczbą opcjonalnych
argumentów, o których do tej pory nie wspomniano, a które znacznie rozszerzają ich
możliwości. Poniżej krótko o tych zagadnieniach.
Uwaga:
·ð W instrukcjach READ, WRITE oraz OPEN muszÄ… wystÄ…pić pierwsze dwa ustalenia. PozostaÅ‚e
ustalenia sÄ… opcjonalne.
·ð Nawiasy < > użyte sÄ… tylko symbolicznie w celu wyróżnienia odpowiednich fragmentów i
nie pojawiajÄ… siÄ™ w instrukcji.
READ([UNIT=], [FMT=],&
IOSTAT=, ERR=,
END=, EOR=, ADVANCE=,&
REC=, SIZE=) lista wejścia
gdzie:
qð [UNIT=] :numer urzÄ…dzenia logicznego lub * w przypadku
czytania z urządzenia standardowego. Słowo kluczowe UNIT= może zostać pominięte jeśli
urządzenie logiczne występuje jako pierwsze ustawienie instrukcji READ.
qð FMT= :staÅ‚a tekstowa zawierajÄ…ca wzorzec redagowania, zmienna tekstowa, której
wartoscia jest wzorzec redagowania, etykieta wskazujÄ…ca na specyfikacjÄ™ FORMAT lub *,
jeśli obowiązuje format swobodny. Jeśli format jest definowany jako drugie z kolei
ustawienie instrukcji READ, to słowo kluczowe FMT= może być pominięte.
qð IOSTAT= :wskazuje na zmiennÄ…, która przechowywać bÄ™dzie kod
powrotu wykonania instrukcji. Wartość 0 kodu powrotu oznacza poprawne wykonanie
instrukcji READ, wartość ujemna oznacza, że napotkano znak końca pliku, zaś wartość
dodatnia oznacza, że nastapił błąd.
qð ERR= :etykieta instrukcji, do której zostanie przeniesione sterowanie w
przypadku wystąpienia błedu czytania.
qð END= :etykieta instrukcji, do której zostanie przeniesione sterowanie w
przypadku napotkania znaku końca pliku. Opcja dostępna tylko dla instrukcji READ.
qð ADVANCE= :okreÅ›la czy instrukcja READ powinna powodować
rozpoczęcie nowego rekordu. Wartością domyślną jest ADVANCE='YES', czyli rozpoczęcie
nowego rekordu. Podanie ADVANCE='NO' sprawia, że nie następuje przejście do kolejnego
rekordu, ale uwaga, użycie tej opcji jest dozwolone tylko dla plików o dostępie
sekwencyjnym oraz przy jawnie zdefiniowanym formacie (nie jest dozwolony format
swobodny).
qð EOR= :etykieta instrukcji, do której zostanie przeniesione sterowanie w
przypadku napotkania znaku końca rekordu. Opcja dostępna tylko dla instrukcji READ i
tylko wtedy, gdy obowiÄ…zuje ustawienie ADVANCE='NO'.
qð REC= :okreÅ›la numer rekordu w przypadku plików o dostÄ™pie
bezpośrednim.
qð SIZE= :po wykonaniu instrukcji READ podana w tej opcji zmienna
będzie zawierać liczbę przeczytanych znaków. Opcja dostępna tylko dla instrukcji READ i
tylko wtedy, gdy obowiÄ…zuje ustawienie ADVANCE='NO'.
Anna Trykozko, Fortran 90 - wprowadzenie do programowania 2006-01-16
Operacje wejścia/wyjścia 8
WRITE([UNIT=], [FMT=],&
IOSTAT=, ERR=,
ADVANCE=,&
REC=) lista wyjścia
gdzie:
qð [UNIT=] :numer urzÄ…dzenia logicznego lub * w przypadku
pisania na urządzenie standardowe. Słowo kluczowe UNIT= może zostać pominięte jeśli
urządzenie logiczne występuje jako pierwsze ustawienie instrukcji WRITE.
qð FMT= :staÅ‚a tekstowa zawierajÄ…ca wzorzec redagowania, zmienna tekstowa, której
wartoscia jest wzorzec redagowania, etykieta wskazujÄ…ca na specyfikacjÄ™ FORMAT lub *,
jeśli obowiązuje format swobodny. Jeśli format jest definowany jako drugie z kolei
ustawienie instrukcji WRITE, to słowo kluczowe FMT= może być pominięte.
qð IOSTAT= :wskazuje na zmiennÄ…, która przechowywać bÄ™dzie kod
powrotu wykonania instrukcji. Wartość 0 kodu powrotu oznacza poprawne wykonanie
instrukcji WRITE.
qð ERR= :etykieta instrukcji, do której zostanie przeniesione sterowanie w
przypadku wystąpienia błedu pisania.
qð ADVANCE= :okreÅ›la czy instrukcja WRITE powinna powodować
rozpoczęcie nowego rekordu. Wartością domyślną jest ADVANCE='YES', czyli rozpoczęcie
nowego rekordu. Podanie ADVANCE='NO' sprawia, że nie następuje przejście do kolejnego
rekordu, ale użycie tej opcji jest dozwolone tylko dla plików o dostępie sekwencyjnym oraz
przy jawnie zdefiniowanym formacie (nie jest dozwolony format swobodny).
qð REC= :okreÅ›la numer rekordu w przypadku plików o dostÄ™pie
bezpośrednim.
OPEN([UNIT=], FILE=, ERR=,&
STATUS=, ACCESS=, ACTION=,&
RECL=)
qð [UNIT=] :podaje numer, poprzez który nastÄ…pi odwoÅ‚anie do pliku.
Nie można podać numeru, który już jest w użyciu.
qð FILE= :podanie nazwy pliku, który zostanie utożsamiony z urzÄ…dzeniem
logicznym.
qð ERR=