Programmiersprache Pascal

Formatierte Ein- und Ausgabe

Formatierte Ein- und Ausgabe spielt eine Rolle im Zusammenhang mit Textdateien.
Sie betrifft auch die Standardein- und -ausgabe: INPUT und OUTPUT sind spezielle Textdateien.

Bemerkung:
Die Angaben gelten weitgehend analog auch für die Ein- und Ausgabe mit internen Dateien in Extended Pascal.

Ausgabe

Ausgabe einer Textzeile

  Writeln(datei_variable, wert_1, ..., wert_n);
Die in der Ausgabeliste angegebenen Werte werden in die Datei geschrieben, die an datei_variable gebunden ist.
Die Ausgabe schließt mit einem Zeilenwechsel ab.

Wird datei_variable nicht angegeben, so wird auf die Standardausgabe (OUTPUT) geschrieben.
wert_1, ..., wert_n ist eine beliebig lange Liste von Ausdrücken. Diese Liste darf leer sein.
Alternativ könnte auch die Anweisungsfolge

  Write(datei_variable, wert_1);
    ...
  Write(datei_variable, wert_n);
  Writeln(datei_variable);
angewendet werden.

Hinsichtlich des Typs der Ausdrücke in der Ausgabeliste bestehen einige Einschränkungen.
Möglich sind in jedem Fall:

Die Werte von aggregierten Datentypen müssen im allgemeinen komponentenweise ausgegeben werden.

Jedem Wert in der Ausgabeliste kann wahlweise ein Format-Deskriptor nachgestellt werden:

  wert : format_deskriptor
Ein Format-Deskriptor kann eine der beiden folgenden Gestalten annehmen:
  w      ganze Zahl, w <> 0
         Ausgabeweite: es werden mindestens w Zeichen ausgegeben
  d      ganze Zahl, 
         Anzahl der Nachkommastellen bei reellen Zahlen
Wird kein Format-Deskriptor angegeben, so wird ein implementationsspezifisches Standardformat verwendet.

Erfordert die Ausgabe eines Wertes weniger Stellen als mit der Ausgabeweite w gefordert, so wird mit Leerzeichen aufgefüllt.
Die Ausrichtung der Zeichen erfolgt im allgemeinen rechtsbündig, d.h. es werden führende Leerzeichen eingefügt.

Erfordert die Ausgabe eines Wertes mehr Stellen als mit der Ausgabeweite w gefordert, so wird implementationsspezifisch verfahren:

Fehlende Format-Deskriptoren werden wie folgt ergänzt:
                XL-Pascal  Gnu-Pascal  Turbo-Pascal  Delphi
INTEGER          12         10          minimal       minimal
CHAR              1          1          1             1
BOOLEAN          10          6          minimal       minimal
REAL             20         14                        17:11
SHORTREAL        20
Bei PACKED ARRAY[1..n] OF CHAR werden n Zeichen ausgegeben, bei STRING(n) oder STRING[n] alle der aktuellen Länge entsprechenden Zeichen, also maximal n Zeichen.

Turbo Pascal gibt nur soviele Zeichen aus, wie für jeweils notwendig empfunden werden. Dies ist platzsparend, führt jedoch dazu, daß Tabellen fast immer mit Hilfe von Format-Deskriptoren aufgebaut werden müssen.

Die Angabe einer negativen Ausgabeweite w kann bei einigen Pascal-Systemen (z.B. Turbo Pascal) zu einer anderen Strategie beim Auffüllen mit Leerzeichen fü:hren: Die Zeichen werden nicht rechtsbündig, sondern linksbündig angeordnet.

Bei fehlender Angabe von Format-Deskriptoren sind die von verschiedenen Pascal-Systemen erstellten Textdateien nicht identisch !
Die Dateien unterscheiden sich nicht in der Anzahl der erzeugten Zeilen, wohl aber in der Zeilenstruktur !

Beispiel:

  PROGRAM fmt(OUTPUT);
  VAR i : INTEGER;
      r : REAL;
      b : BOOLEAN;
      c : PACKED ARRAY[1..10] OF CHAR;
      s : STRING(10);                      { systemabhängig }
  BEGIN
    i := 11;
    Writeln('|', i, '|', i:5, '|');
    r := 12.345;
    Writeln('|', r, '|', r:10:2, '|', r:4:2, '|');
    b := TRUE;
    Writeln('|', b, '|', b:8, '|', b:2, '|');
    c := '1234567890';
    Writeln('|', c, '|', c:8, '|', c:2, '|');
    s := 'Test';
    Writeln('|', s, '|', s:8, '|', s:2, '|');
  END.
Das Programm erzeugt folgende Ausgaben:
Gnu-Pascal
  |        11|   11|
  | 1.2345000e+01| 1.235e+01| 1.2e+01|
  |  True|    True|Tr|
  |1234567890|12345678|12|
  |Test|    Test|Te|
Pascal++
  |    11|   11|
  | 1.2E+001|     12.35|*****|      irreguläres Programmverhalten
  | TRUE|    TRUE|TRUE|
  |1234567890|12345678|12|
  |Test|    Test|Te|
XL-Pascal
  |          11|   11|
  | 1.234500000000E+001|     12.35|12.35|
  |      TRUE|    TRUE|TR|
  |1234567890|12345678|12|
  |Test|    Test|Te|
Turbo Pascal 7.0
  |11|   11|
  | 1.2345000000E+01|     12.35|12.35|
  |TRUE|    TRUE|TRUE|
  |1234567890|1234567890|1234567890|
  |Test|    Test|Test|
Bemerkung:
  Writeln(datei_variable);
bewirkt die Ausgabe einer Leerzeile.

Writeln(OUTPUT, ...) entspricht Writeln(...).


Ausgabe von Teilen einer Textzeile

  Write(datei_variable, wert_1, ..., wert_n);
Write arbeitet im wesentlichen genau wie Writeln, nur daß die Ausgabe nicht mit einem Zeilenwechsel abgeschlossen wird.

Die obige Zeile entspricht der Anweisungsfolge

  Write(datei_variable, wert_1);
    ...
  Write(datei_variable, wert_n);
Seitenwechsel
  Page(datei_variable);
Page realisiert die Ausgabe des Steuerzeichens für den Seitenvorschub (form feed).
Bei Verwendung des ASCII-Zeichensatzes ist dies das Zeichen mit der Ordnungsnummer 12 (^L, abgekürzt FF).

Der Seitenwechsel ist nur von Bedeutung bei der Ausgabe von Textdateien auf einen Drucker (oder ein vergleichbares Gerät).
Bei der Bildschirmausgabe wird ein Seitenwechsel nicht wirksam (eventuell erscheint eine Leerzeile).


Eingabe

Eingabe einer Textzeile

  Readln(datei_variable, var_1, ..., var_n);
Die in der Eingabeliste enthaltenen Variablen var_1, ..., var_n werden mit den in einer Textzeile enthaltenen Werten belegt. Die Eingabe wird mit einem Zeilenwechsel abgeschlossen wird.

Die obige Zeile entspricht der Anweisungsfolge

  Read(datei_variable, var_1);
    ...
  Read(datei_variable, var_n);
Mehrere Werte innerhalb einer Zeile werden durch Leerzeichen (oder Tabulatoren) voneinander getrennt.
Bemerkung: Dies ist natürlich nur für Datentypen praktikabel, deren Werte keine Leerzeichen (oder Tabulatoren) enthalten.

Die Anwendung von Format-Deskriptoren in Zusammenhang mit der Eingabe wird durch die Pascal-Standards nicht unterstützt.
Sie ist jedoch z.B. in XL-Pascal realisiert: Der Format-Deskriptor besteht aus der Eingabeweite w.

Beispiel:

  VAR i : INTEGER;
      r : REAL;
      s : STRING(10);
  BEGIN
    Read(i:2, r:3, s);                        { !! Spracherweiterung !! }
    Writeln('|', i, '|', r, '|', s, '|');
  END;
Die Eingabe
  123456789
liefert unter XL-Pascal
  |          12| 3.450000000000E+002|6789|
Eingabe von Teilen einer Textzeile
  Read(datei_variable, var_1, ..., var_n);
Read arbeitet im wesentlichen genau wie Readln, nur daß die Ausgabe nicht mit einem Zeilenwechsel abgeschlossen wird.

Die obige Zeile entspricht der Anweisungsfolge

  Read(datei_variable, var_1);
    ...
  Read(datei_variable, var_n);


P. Böhme, 19.07.1996