====== Ein- und Ausgabe ====== Ein- und Ausgabe ist eine sehr wichtige Aufgabe der meisten Programme, schließlich wollen wir Ergebnisse von Berechnungen auch am Bildschirm sehen. Wir beginnen bei den einfachen Ein- und Ausgabeoperationen, danach werden wir weitere Parameter an die Ein- bzw. Ausgabe stellen. ===== Anweisungen ===== Die einfachsten Anweisungen für die Ein- und Ausgabe sind jeweils ''READ'' bzw. ''WRITE'' mit Standardparameter (*). Bspw. integer a, b READ (*,*) a, b WRITE (*,*) a Sie sehen zwei Sterne als Platzhalter für Parameter an die Eingabe / Ausgabe. Der erste Parameter gibt die Unit (Ausgabedatei) an, in die geschrieben werden soll / von der gelesen werden soll, beim zweiten Parameter lassen sich einige Anforderungen an die Ein- / Ausgabe stellen. Es gibt noch eine weitere Anweisung ''PRINT'', die allerdings in neuen Programmen nicht mehr eingesetzt werden sollte. Stattdessen sollte ''WRITE'' verwendet werden, was vielseitiger einsetzbar ist. Der Stern bei ''PRINT'' ist mit dem zweiten Stern von ''WRITE'' gleichzusetzen; ''PRINT'' schreibt automatisch nach ''stdout'' (UNIT 6) PRINT *, a ===== Formale Parameterliste ===== (READ | WRITE) ([UNIT=], [FMT=]][,END=][,ERR=][,IOSTAT=][,REC=iasudr]) ioliste ^ Parameter ^ Bedeutung ^ Beispiel ^ | UNIT | gibt die Unitnummer an; eine Unitnummer ist eine logische Dateinummer (0 bis X), die einer Datei zugeordnet ist. \\ Gibt es die Datei noch nicht, wird eine Datei angelegt nach dem Schema "." | WRITE (6, *) a WRITE (2, *) | | FMT | Formatstring oder Marke, an der der Formatstring zu finden ist. Ein Formatstring gibt die Art und Weise an, wie die ioliste auszugeben ist. | WRITE (*, '(A,$)') a ! a ist ein String ! nach der Ausgabe wird kein Newline angehängt ! (Cursor bleibt auf der Seite stehen) | | END | Marke, an die gesprungen wird, wenn das Dateienede beim Lesen erreicht wurde | READ (x, END=120) a 120 CONTINUE | | ERR | Marke, an die gesprungen wird, wenn ein Fehler auftritt (bspw. unpassende Eingabe, Zugriffsrechte, etc.) | READ (x, ERR=150) a 150 CONTINUE | | IOSTAT | Zustandsvariable; die angegebene Variable wird nach der E/A-Operation gesetzt, entsprechend dem Fehlerzustand. Bei fehlerfreier E/A -> ivar=0 | READ (x, IOSTAT=meineVar) a, b, c | | REC | Bei Direktzugriff: Nummer des Datensatzes | | | ioliste | Eine Liste von Parametern (Variablen), die ausgegeben bzw. in die eingelesen werden soll. | READ (*,*) a,b,c | ===== Warum wird ein Leerzeichen vor dem eigentlichen String ausgegeben? ===== Wie Sie in vorherigen Programmen sicher schon gemerkt haben, wird bei der Ausgabe normalerweise ein Leerzeichen dem eigentlichen auszugebendenen String vorangestellt. Bspw. bei unserem ersten Programm, dem Hello-World-Programm: PROGRAM HELLO_WORLD write (*,*) "Hello World" END Die Ausgabe ergab: Hello World Wo kommt das Leerzeichen her? Fortran ist eine sehr alte Programmiersprache, die bereits existierte als so genannte Line Printer modern waren, also Drucker, die eine Zeile ausgegeben haben. Um einen solchen Drucker steuern zu können, bedurfte es einem Zeichen am Anfang der Zeile, welches angab, was der Drucker zu tun hatte. Dieses Zeichen nennt sich [[https://en.wikipedia.org/wiki/ASA_carriage_control_characters|ASA Carriage Control Characters]]. So konnte u.A. eingestellt werden, dass der Drucker nur eine Zeile weiterfuhr (Standard), zwei Zeilen oder überhaupt nicht, sodass man bspw. durch Unterstriche eine Unterstreichung der gerade gedruckten Worte erzeugen konnte. Heutige Compiler geben diese Zeichen einfach aus. Da heutige Drucker auf solche Zeichen nicht mehr reagieren bzw. diese Zeichen heutzutage keinen echten Wert mehr haben, können sie bei Ihren Programmen weggelassen werden. Im nächsten Kapitel wenden wir uns (dazu) den [[fortran:format|Formatstrings]] zu.