====== Formatstrings ====== Formatstrings dienen dazu die Ausgabe / Eingabe zu formatieren. So kann bspw. bei Eingaben angegeben werden, welche Datentypen erwartet werden, oder bei Ausgaben, welche Datentypen wie ausgegeben werden (bspw. hexadezimal, etc). ===== Angabe von Formatstrings ===== Formatstrings können bei WRITE/READ-Anweisungen folgendermaßen angegeben werden: * garnicht; Standardformat entsprechend dem Typ der Variablen (durch *) * Marke; an der Marke steht dann die entsprechende Formatliste via FORMAT() * '(fliste)' - direkte Angabe der Formatanweisung als String an READ oder WRITE Eine Formatliste enthält durch Komma getrennte Formatelemente: * ein Datenformatelement pro Variable (z.B. I, F, E ... ) * dazwischen beliebig viele Steuerelemente, die keinen direkten Bezug zu Variablen aufweisen (z.B. X, T, $,...) Ein Datenformatelement kann folgendermaßen angegeben werden: nFw.d * n -> Wiederholungsfaktor des Datenelements * w -> Gesamtzeichenzahl * d -> Zusatzangabe; bei F (Real) Anzahl der Nachkommastellen Eine Gruppierung von Elementen ist möglich via Klammerung: FORMAT(5(I2,':', F6.2)) ===== Formatelemente ===== ^ Format ^ Bedeutung ^ Beispiel ^ Wert ^ Ausgabe ^ | Iw[.m] | Ausgabe von Integerzahlen, **rechtsbündig**, mindestens //m// Ziffern | I5 | -23 | -23 | | Fw.d | Ausgabe von real mit Festkomma; //d// Kommastellen | F5.1 | 12.123 | 12.1 | | Ew.d[Ee] | Ausgabe von real mit Gleitkomma; //d// Matisseziffern, //e// Exponentenziffern | E9.2 | -1.0 | -00.10E+01 | | ENw.d[Ee] | siehe E; Angabe des Exponenten erfolgt in 3er-Schritten (einfache Umrechnung in metrische Einheiten möglich); passt die Zahl nicht in //w// Zeichen werden //w// Sterne ausgegeben. | EN9.2 | 23 | 23E+00 | | ESw.d[Ee] | siehe E; Ausgabe des Exponenten erfolgt in 1er Schritten, dabei steht vor dem Komma der Mantisse nie eine 0 | ES9.2 | 23 | 2.3E+01 | | Dw.d | siehe E | | | | | Lw | Ausgabe von Logical-Werten, rechtsbündig | L3 | (2>1) | T | | A[w] | Ausgabe von Character mit //w// Zeichen, **rechtsbündig** | A3 | 'Texte' | 'Tex' | | Gw.d[Ee] | generisches Format, gibt die Werte angepasst an den Typ und Wert der Variablen aus | G9.2 | 0.002 | 0.20E-01 | | Zw[.m] | hexadezimal Ausgabe von integer, real, logical mit mindestens //m// Hexadezimalstellen | Z9.8 | 20 | 00000014 | | Ow[.m] | siehe Z; Ausgabe als Oktalzahlen | | | | | Bw[.m] | siehe W; Ausgabe als Binärzahlen | | | | ^ Steuerelemente ^ ^ ^ ^ ^ | '...' | die Zeichenkette ausgeben | 'Hallo' | | Hallo | | nH... | Hollerith-Konstante (Zeichenkette) ausgeben; die Zeichenkette hat dabei //n// Zeichen | 5HHallo | | Hallo | | Tn | In der Zeile zur Position //n// springen (absolute Angabe) |||| | TRn | In der Zeile um //n// Zeichen nach rechts springen (relativ) |||| | TLN | In der Zeile um //n// Zeichen nach links springen (relativ) |||| | nX | //n// Leerzeichen ausgeben |||| | / | Neuer Datensatz / Neue Zeile, Möglich ist neben ...,/,... auch .../... |||| | nP | Skalierungsfaktor 10^n für alle nachfolgenden E und F-Formate |||| | SP | Erzwingt die Ausgabe des Vorzeichens auch bei positiven Zahlen |||| | SS | Gibt die Vorzeichen bei positiven Zahlen nicht (mehr) mit aus |||| | BN | Leerzeichen bei der Eingabe ignorieren |||| | BZ | Leerzeichen bei der Eingabe als 0 interpretieren |||| | : | vorzeitiges Ende der Ausgabe, falls die ioliste abgearbeitet ist. |||| | $ | steht am Ende der Formatliste; erzwingt, dass der Cursor nach der Ausgabe stehenbleibt; dh. kein Newline am Ende der Ausgabe |||| Jedem Datenelement aus der ioliste wird ein Datenformat aus der Formatliste zugeordnet, zwischen den Datenformatelementen stehende Steuerzeichen werden noch verarbeitet, selbst wenn die ioliste erschöpft ist (das Steuerzeichen ":" verhindert das). Beim Ende der Formatliste wird ein Newline-Zeichen ausgegeben, dann geht es bei der letzten Formatgruppe (Klammerung) der Formatliste weiter. ===== Beispiele ===== Eine Eingabe soll direkt hinter der Frage nach der Eingabe erfolgen: integer a WRITE (*,'(A,$)') "Bitte geben Sie eine Integerzahl ein: " READ (*,*) a Ausgabe einer Matrix A zeilenweise, dabei werden acht Werte auf eine Zeile geschrieben (wir ignorieren hier, dass Matrizen in Fortran spaltenweise gespeichert werden): program main INTEGER,PARAMETER :: N = 100 REAL,DIMENSION(N,N) :: A INTEGER :: i, k ! Initialisieren von A do i=1, N do k=1, N A(i,k) = i*1000+k; enddo enddo ! Ausgabe von A do i=1, N write (*, '(6HZeile , I3 / (1X, 8E10.2))') i, (A(i,j),j=1,N) enddo end program