next up previous contents
Nächste Seite: Externe Ein-/Ausgabe Aufwärts: Erweiterte Ein-/Ausgabe Vorherige Seite: Erweiterte Ein-/Ausgabe   Inhalt

Formatierte Ein-/Ausgabe

Neben der bisher vorgestellten Ein-/Ausgabe im freien Format (listengesteuert) gibt es die formatierte oder formatgesteuerte Ein-/Ausgabe. Dabei wird bei Abarbeitung der Ein-/Ausgabeliste jedem Element der Liste die zugehörige Datenfeldbeschreibung aus der Formatangabe (z.B. FORMAT-Anweisung, s.u.) zugeordnet und das Element entsprechend ausgegeben.

Beispiel (seien i, j, k ganzzahlig):

PRINT 999, i, j, k

999 FORMAT (I4, I2, I5)

Die Integer-Variablen i, j und k werden entsprechend der Formatangabe mit der Marke 999 als 4-, 2- bzw. 5-stellige ganze Zahlen hintereinander in einer Zeile ausgegeben. Dabei ist zu beachten, daß die Formatangaben und die auszugebenden Daten vom Typ her stets zusammenpassen (im obigen Fall: ganzzahlig).

Die Formatbeschreibung wird bis zum Ende der Ein-/Ausgabeliste abgearbeitet. Reicht die Formatbeschreibung nicht aus, wird das Format wiederholt, und dabei wird eine neue Zeile begonnen.

Bei der formatierten Ein-/Ausgabe werden die Daten entsprechend den Formatangaben gelesen und in die interne binäre Darstellung (rechnerabhängig) konvertiert bzw. aus dieser internen Darstellung in Zeichenfolgen umgewandelt. Formatangaben sind in runde Klammern eingeschlossene Zeichenfolgen, die alternativ unter anderem angegeben werden können durch

  1. die Anweisungsmarke einer FORMAT-Anweisung (siehe obiges Beispiel)
  2. den Namen eines Zeichenfeldes
  3. einen beliebigen Zeichenausdruck.

Wir werden hier nur auf die erste Möglichkeit eingehen. Es können sich mehrere Ein-/Ausgabeanweisungen auf die gleiche Formatangabe beziehen.

Die Format-Anweisung

labl FORMAT( flist )

ist eine nichtausführbare Anweisung, die die Konvertierung und Formatierung der zu übertragenden Daten festlegt. Dabei ist labl eine Anweisungsmarke und flist eine Liste von durch Komma getrennten Elementen der Form

r ed, ned, r(flist)

ed und ned sind wiederholbare bzw. nichtwiederholbare Datenfeldbeschreibungen und die Wiederholungszahl $r$ ist eine ganzzahlige Konstante $>$ 0. Fehlt $r$, wird der Wert 1 angenommen.

In den Tabellen 4.2 und 4.3 geben Großbuchstaben die Konvertierungsart an, und kleine Buchstaben bezeichnen vom Programmierer hinzuzufügende Informationen:

$w$
Von Null verschiedene, vorzeichenlose, ganzzahlige Konstante, die die Datenfeldweite der externen Darstellung, d.h. die Anzahl der Zeichen einschließlich führender Leerzeichen, Vorzeichen, Dezimalpunkt und Exponenten angibt.
$d$
Vorzeichenlose, ganzzahlige Konstante, die die Anzahl der Ziffern rechts vom Dezimalpunkt angibt. Bei der Ausgabe werden Zahlen gegebenenfalls gerundet.
$e$
Von Null verschiedene, vorzeichenlose, ganzzahlige Konstante, die die Anzahl der Ziffern im Exponenten angibt.
$m$
Vorzeichenlose, ganzzahlige Konstante, die angibt, wieviele Ziffern mindestens ausgegeben werden sollen.
$k$
Skalierfaktor (genauer: Exponent der Zehnerpotenz), ganzzahlige Konstante.
$n$
Positive ganzzahlige Konstante ungleich Null.


Tabelle 4.1: Wiederholbare Datenfeldbeschreibungen
Form Typ Bedeutung
A Zeichen Zeichen mit datenabhängiger Länge
A$w$ Zeichen Zeichen mit vereinbarter Länge
D$w$.$d$ Numerisch Doppelt genaue Gleitpunktzahl mit Exponent
E$w$.$d$ Numerisch Einfach genaue Gleitpunktzahl mit Exponent
E$w$.$d$E$e$ Numerisch Einfach genaue Gleitpunktzahl mit explizit vereinbarter Länge des Exponenten
F$w$.$d$ Numerisch Einfach genaue Gleitpunktzahl ohne Exponent
G$w$.$d$ Numerisch Einfach genaue Gleitpunktzahl mit oder ohne Exponent
G$w$.$d$E$e$ Numerisch Einfach genaue Gleitpunktzahl ohne Exponent oder mit Exponent (mit explizit vereinbarter Länge des möglichen Exponenten)
I$w$ Numerisch Ganze Dezimalzahl
I$w$.$m$ Numerisch Ganze Dezimalzahl mit mindestens $m$ Ziffern
L$w$ Logisch Logischer Wert



Tabelle 4.2: Nichtwiederholbare Datenfeldbeschreibungen
Form Typ Bedeutung
BN Steuerung der Leerzeichen werden ignoriert
BZ numerischen Eingabe Leerzeichen werden als Nullen aufgefaßt
$k$P Skalierfaktor Skalierung für numerische Konvertierung
$n$X   Setze um $n$ Positionen vor
SP Steuerung der Plus-Zeichen werden vorangestellt
SS numerischen Plus-Zeichen werden unterdrückt
S Ausgabe Plus-Zeichen werden unterdrückt
T$n$ E/A-Tabulator Setze auf Position $n$
TR$n$   Setze um $n$ Positionen vor
TL$n$   Setze um $n$ Positionen zurück
: Formatkontrolle Beendet die Formatabarbeitung
/ Ende des Datensatzes Zeigt das Ende des gegenwärtigen
    Ein- oder Ausgabedatensatzes an
  Verhindert den Zeilenumbruch


Das Ausgabefeld wird bei allen Umwandlungen rechtsbündig aufgefüllt.

Es folgt eine kurze Beschreibung der wichtigsten Datenfeldbeschreibungen (auch: Formatspezifikationen).

Das A-Format dient zur Ein-/Ausgabe von Zeichengrößen und hat die Form

A oder Aw

Ist w kleiner als die Länge der Zeichengröße, dann werden die ersten w Zeichen ausgegeben bzw. die am weitesten rechtsstehenden Zeichen eingelesen, und der Rest wird jeweils ignoriert. Falls w größer als die Länge der Zeichengröße ist, dann wird linksbündig in den Speicher eingelesen bzw. rechtsbündig ausgegeben, und der Rest wird mit Leerzeichen aufgefüllt. Wird keine Datenfeldweite angegeben, wird die Länge der Zeichengröße benutzt.

Innerhalb der Formatangabe auszugebende Zeichenfolgen werden im Apostroph-Format angegeben, d.h. in Apostrophe eingeschlossen.

Beispiel:

         CHARACTER :: what*5
         what = 'ALLES'
         PRINT 120, what
         120 FORMAT (' Ich will', A7)

ergibt die Bildschirm-Ausgabe:

     Spalte:  1234567890123456
     Zeichen:  Ich will  ALLES

Zur Ein-/Ausgabe von reellen Zahlen gibt es u.a. das F-Format und das E-Format. Die einfachste Form dieser Formate ist

Fw.d bzw. Ew.d

Bei der Ausgabe im E-Format wird ein Exponent gedruckt; die Verwendung des F-Formats führt zur Ausgabe einer reellen Zahl ohne Exponent.

Bei der Eingabe werden genau w Zeichen eingelesen. Es können auch Zahlen im jeweils anderen Format eingelesen werden, z.B. kann man mit dem F-Format auch Zahlen lesen, die im E-Format auf dem Datensatz stehen. Reelle Zahlen sollten im Eingabebereich stets mit Dezimalpunkt geschrieben werden. Bei der Ausgabe im E-Format in der oben angegebenen Form hat der Exponent stets zwei Stellen plus ein Vorzeichen, d.h. zur Darstellung des Exponenten werden von der gesamten Feldweite w vier Stellen verwendet. Die Mantisse ist stets: 0.1 $\le$ Mantisse $< 1.0$ (Ausnahme: Die Zahl Null), und der Exponent wird entsprechend angeglichen. Allgemein muß die Feldweite so groß sein, daß alle Zeichen auch ausgegeben werden können. Dies gilt insbesondere für das F-Format. Falls w zu klein gewählt wird, werden w Sterne gedruckt. Falls w zu groß ist, wird rechtsbündig ausgegeben und mit Leerzeichen aufgefüllt.

Beispiel:

         REAL :: alfa
         alfa = -3.98E+03
         PRINT 910 ,(alfa, i = 1,5)
         910 FORMAT (' ', F8.2, F5.0, E10.3, E8.1, E6.1)

erzeugt die Ausgabe (auf einer Datei):

Spalten:  12345678901234567890123456789012345678
Zeichen:   -3980.00***** -.398E+04 -.4E+04******

Das erste Zeichen der Ausgabezeile ist ein sogenanntes Vorschubsteuerzeichen für den Drucker. Wir werden darauf später eingehen. Die beiden ersten Formatspezifikationen geben alfa ohne Exponent aus, die anderen drei bewirken eine Ausgabe mit Exponent. Die Feldweiten des 2. und 5. Formats sind zu klein um die notwendigen Zeichen aufzunehmen, daher werden Sterne gedruckt. Das vierte Format verwendet nur eine Stelle für die Mantisse, die daher gerundet wird.

Die Ausgabe ganzzahliger Variabler mit E- oder F-Format produziert nicht vorhersehbare Ergebnisse, da ganze und reelle Zahlen intern unterschiedlich dargestellt werden (siehe Kapitel 5).

Zur Ein-/Ausgabe ganzer Zahlen dient das I-Format:

Iw

Bei der Eingabe werden genau w Zeichen eingelesen. Die Zahl sollte rechtsbündig geschrieben werden, da abhängig von der Voreinstellung des Compilers Leerzeichen als Nullen interpretiert werden können. Standard ist, daß Leerzeichen ignoriert werden. Ein vollständig leeres Feld wird jedoch als Null interpretiert. Dezimalpunkte sind verboten. Die Ausgabe erfolgt ohne Dezimalpunkt. Für negative Zahlen wird das Vorzeichen unmittelbar vor die erste Ziffer gedruckt.

Beispiel:

         INTEGER :: izahl1, izahl2
         izahl1 = -123
         izahl2 = +45678
         PRINT 117, izahl1, izahl2
         117 FORMAT (' ', 2I4)

erzeugt die Ausgabe

Spalten:  1234567890
Zeichen:   -123****

Die zweite Datenfeldbeschreibung ist zu klein, es werden vier Sterne ausgegeben.

Das L-Format wird benutzt, um logische Daten ein- oder auszugeben:

Lw

Bei der Eingabe wird dem logischen Listenelement der Wert .TRUE. oder .FALSE. zugeordnet, wenn die ersten von Leerzeichen verschiedenen Zeichen T oder .T bzw. F oder .F sind. Bei der Ausgabe werden .TRUE. und .FALSE. rechtsbündig mit $w-1$ führenden Leerzeichen als T bzw. F ausgegeben.

Beispiel:

        LOGICAL :: ok, ko
        ok = .TRUE.
        ko = .FALSE.
        PRINT 135, ok, ko
        135 FORMAT (' ', 2L3)

erzeugt die Ausgabe:

Spalten:   1234567890
Zeichen:      T  F

Der Schrägstrich / (,,Slash``) innerhalb einer Formatangabe zeigt das Ende des letzten und den Beginn eines neuen Datensatzes an, es wird also eine neue Zeile begonnen.

Das X-Format wird verwendet, um Zeichen zu überspringen. Seine Form ist

nX

und $n$ ist eine ganze Zahl $>$ 0, die die Anzahl der zu überspringenden Zeichenpositionen angibt, ausgehend von der augenblicklichen Position. Bei der Ausgabe werden übersprungene noch nicht gefüllte Positionen des Datensatzes mit Leerzeichen gefüllt. Das X-Format sollte besser durch das allgemeinere Tabulatorformat T, insbesondere den Rechtstabulator TRn ersetzt werden.

Einzelne Formatspezifikationen oder ganze Gruppen können durch Angabe eines Wiederholungsfaktors wiederholt werden. Gruppen werden dabei in Klammern eingeschlossen.

Beispiel:

     102 FORMAT (3I4, 2(1X, 2F6.1))

entspricht:

     102 FORMAT (I4, I4, I4, 1X, F6.1, F6.1, 1X, F6.1, F6.1)

Das erste Zeichen eines jeden Datensatzes wird bei der Ausgabe auf manchen Druckern nicht ausgedruckt sondern zur Verschubsteuerung benutzt. Bei anderen Ausgabemedien gehört es zu den Daten. Es gibt drei Zeichen, die besondere Aktionen des Druckers bewirken können:


		0		 eine Leerzeile vor dem Drucken 

1 Vorschub auf den Anfang einerneuen Seite
+ kein Vorschub, in der gleichenZeile weiterdrucken.

Um einer eventuellen Fehlinterpretation der Daten in der ersten Spalte jedes Datensatzes beim Fortlassen der Vorschubzeichen aus dem Weg zu gehen,sollte bei der Ausgabe das erste Zeichen jeder Zeile ein Leerzeichen sein. Dieses Leerzeichen sollte explizit angegeben werden und nicht in einer Formatspezifikation ,,versteckt`` werden. Also:

100 FORMAT (1X, I4, 2F5.2)

und nicht

100 FORMAT (I5, 2F5.2)


next up previous contents
Nächste Seite: Externe Ein-/Ausgabe Aufwärts: Erweiterte Ein-/Ausgabe Vorherige Seite: Erweiterte Ein-/Ausgabe   Inhalt
Lars Tornow 2003-03-31