Next: Schriftzeichen, Previous: Einführung in die Verarbeitung von Zeichenketten, Up: stringproc [Contents][Index]

### 73.2 Ein- und Ausgabe

Beispiel: Formatiertes Schreiben in eine Datei mit anschließendem Lesen.

    (%i1) s: openw("file.txt");
    (%o1)                      #<output stream file.txt>
    (%i2) control:
    "~2tAn atom: ~20t~a~%~2tand a list: ~20t~{~r ~}~%~2t\
    and an integer: ~20t~d~%"$
    (%i3) printf(s, control, 'true,[1,2,3],42)$
    (%o3)                                false
    (%i4) close(s);
    (%o4)                                true
    (%i5) s: openr("file.txt");
    (%o5)                      #<input stream file.txt>
    (%i6) while stringp(tmp:readline(s)) do print(tmp)$
      An atom:          true
      and a list:       one two three
      and an integer:   42
    (%i7) close(s)$

Beispiel: Lesen aus einer binären Datei. Siehe readbyte.

Funktion: close (stream)

  Schließt den Datenstrom stream und gibt `true` zurück, wenn stream noch geöffnet war.

Funktion: flength (stream)

  stream muss ein geöffneter Datenstrom in eine oder aus einer Datei sein. `flength` gibt dann die Anzahl der Bytes zurück, die sich momentan in dieser Datei befinden.

  Beispiel: Siehe writebyte .

Funktion: flush_output (stream)

  Leert den Inhalt des Dateiausgabestroms stream in die Datei.

  Beispiel: Siehe writebyte .

Function: fposition (stream)
Function: fposition (stream, pos)

  Ohne das optionale Argument pos gibt `fposition` die aktuelle Position in dem Datenstrom stream zurück. Wird pos verwendet, legt `fposition` diesen Wert als aktuelle Position in stream fest. pos muss eine positive Zahl sein.

  Die Positionen in Datenströmen sind wie in Zeichenketten und Listen 1-indiziert, d.h. das erste Element in stream hat die Position 1.

Function: freshline ()
Function: freshline (stream)

  Schreibt einen Zeilenumbruch in den Standardausgabestrom, falls die aktuelle Ausgabeposition nicht gerade der Anfang einer Zeile ist und gibt `true` zurück. Bei der Verwendung des optionalen Arguments stream wird der Umbruch in diesen Datenstrom geschrieben.

  Es gibt Situationen, in denen `freshline()` nicht wie erwartet funktioniert.

  Siehe auch newline.

Funktion: get_output_stream_string (stream)

  Gibt Schriftzeichen, die aktuell in dem geöffneten Datenstrom stream enthalten sind, in einer Zeichenkette zurück. Die zurück gegebenen Zeichen werden dabei aus dem Datenstrom entfernt. stream muss durch `make_string_output_stream` erzeugt worden sein.

  Beispiel: Siehe make_string_output_stream .

Funktion: make_string_input_stream (string)
Funktion: make_string_input_stream (string, start)
Funktion: make_string_input_stream (string, start, end)

  Gibt einen Datenstrom zurück, der Teile der Zeichenkette string und ein Dateiende enthält. Ohne optionale Argumente enthält der Strom die gesamte Zeichenkette und ist vor dem ersten Zeichen positioniert. Mit den optionalen Argumenten start und end lässt sich der Abschnitt der Zeichenkette festlegen, den der Datenstrom enthält. Das erste Zeichen befindet sich dabei an der Position 1.

      (%i1) istream : make_string_input_stream("text", 1, 4);
      (%o1)              #<string-input stream from "text">
      (%i2) (while (c : readchar(istream)) # false do sprint(c), newline())$
      t e x
      (%i3) close(istream)$

Funktion: make_string_output_stream ()

  Gibt einen Datenstrom zurück, der Schriftzeichen aufnehmen kann. Die aktuell im Strom enthaltenden Zeichen können mit get_output_stream_string entnommen werden.

      (%i1) ostream : make_string_output_stream();
      (%o1)               #<string-output stream 09622ea0>
      (%i2) printf(ostream, "foo")$

      (%i3) printf(ostream, "bar")$

      (%i4) string : get_output_stream_string(ostream);
      (%o4)                            foobar
      (%i5) printf(ostream, "baz")$

      (%i6) string : get_output_stream_string(ostream);
      (%o6)                              baz
      (%i7) close(ostream)$

Funktion: newline ()
Funktion: newline (stream)

  Schreibt einen Zeilenumbruch in den Standardausgabestrom und gibt `false` zurück. Bei der Verwendung des optionalen Arguments stream wird der Umbruch in diesen Datenstrom geschrieben. Es gibt Situationen, in denen `newline()` nicht wie erwartet funktioniert.

  Beispiel: Siehe sprint.

Funktion: opena (file)

  Gibt einen Dateiausgabestrom für Schriftzeichen zurück. Sollte die Textdatei file nicht existieren, wird sie erzeugt. Wird eine bereits vorhandene Datei geöffnet, werden alle Ausgaben in die Datei am Ende hinzugefügt.

  opena_binary ist die entsprechende Funktion für die Ausgabe in eine Binärdatei.

Funktion: openr (file)

  Gibt einen Dateieingabestrom für Schriftzeichen aus einer Textdatei zurück. Voraussetzung ist, dass die Datei file bereits existiert.

  openr_binary ist die entsprechende Funktion für die Eingabe aus einer Binärdatei.

Funktion: openw (file)

  Gibt einen Dateiausgabestrom für Schriftzeichen zurück. Sollte die Textdatei file nicht existieren, wird sie erzeugt. Wird eine bereits vorhandene Datei geöffnet, wird sie destruktiv verändert.

  openw_binary ist die entsprechende Funktion für die Ausgabe in eine Binärdatei.

Function: printf (dest, string)
Function: printf (dest, string, expr_1, …, expr_n)

  Erzeugt eine formatierte Ausgabe. Der Zielparameter dest gibt an, wo die Ausgabe erfolgen soll. Möglich sind hier ein Ausgabestrom oder die globalen Variablen `true` und `false`. `true` bewirkt eine Ausgabe im Terminal. Der Rückgabewert von `printf` ist in diesem Fall `false`. `false` als Zielparameter bewirkt die Ausgabe im Rückgabewert.

  Die Zeichen des Kontrollparameters string werden der Reihe nach ausgegeben, wobei jedoch eine Tilde eine Direktive einleitet. Die Direktiven verwenden dann im Allgemeinen die nachstehenden Parameter expr_1, …, expr_n, um die Ausgabe zu erzeugen. Das Zeichen nach der Tilde gibt dabei an, welche Art der Formatierung gewünscht ist.

  `printf` stellt die Common Lisp Funktion `format` in Maxima zur Verfügung. Das folgende Beispiel zeigt die grundsätzliche Beziehung zwischen diesen beiden Funktionen.

      (%i1) printf(true, "R~dD~d~%", 2, 2);
      R2D2
      (%o1)                                false
      (%i2) :lisp (format t "R~dD~d~%" 2 2)
      R2D2
      NIL

  Die folgende Beschreibung und die Beispiele beschränken sich auf eine grobe Skizze der Verwendungsmöglichkeiten von `printf`. Die Lisp Funktion `format` ist in vielen Referenzbüchern ausführlich beschrieben. Eine hilfreiche Quelle ist z.B. das frei verfügbare Online-Manual "Common Lisp the Language" von Guy L. Steele. Siehe dort das Kapitel 22.3.3.

         ~%       new line
         ~&       fresh line
         ~t       tab
         ~$       monetary
         ~d       decimal integer
         ~b       binary integer
         ~o       octal integer
         ~x       hexadecimal integer
         ~br      base-b integer
         ~r       spell an integer
         ~p       plural
         ~f       floating point
         ~e       scientific notation
         ~g       ~f or ~e, depending upon magnitude
         ~h       bigfloat
         ~a       uses Maxima function string
         ~s       like ~a, but output enclosed in "double quotes"
         ~~       ~
         ~<       justification, ~> terminates
         ~(       case conversion, ~) terminates
         ~[       selection, ~] terminates
         ~{       iteration, ~} terminates

  Die Direktive ~h für Gleitkommazahlen mit beliebiger Genauigkeit entspricht nicht dem Lisp-Standard und wird daher unten näher beschrieben.

  Die Direktive ~* wird nicht unterstützt.

  Ist dest ein Datenstrom oder `true`, gibt `printf` `false` zurück. Andernfalls ist der Rückgabewert eine Zeichenkette.

      (%i1) printf( false, "~a ~a ~4f ~a ~@r",
                    "String",sym,bound,sqrt(12),144), bound = 1.234;
      (%o1)                 String sym 1.23 2*sqrt(3) CXLIV
      (%i2) printf( false,"~{~a ~}",["one",2,"THREE"] );
      (%o2)                          one 2 THREE
      (%i3) printf( true,"~{~{~9,1f ~}~%~}",mat ),
                mat = args(matrix([1.1,2,3.33],[4,5,6],[7,8.88,9]))$
            1.1       2.0       3.3
            4.0       5.0       6.0
            7.0       8.9       9.0
      (%i4) control: "~:(~r~) bird~p ~[is~;are~] singing."$
      (%i5) printf( false, control, n,n, if n = 1 then 1 else 2 ), n = 2;
      (%o5)                    Two birds are singing.

  Die Direktive ~h wurde für Gleitkommazahlen mit beliebiger Genauigkeit eingeführt.

      ~w,d,e,x,o,p@H
       w : width
       d : decimal digits behind floating point
       e : minimal exponent digits
       x : preferred exponent
       o : overflow character
       p : padding character
       @ : display sign for positive numbers

      (%i1) fpprec : 1000$
      (%i2) printf(true, "|~h|~%", 2.b0^-64)$
      |0.0000000000000000000542101086242752217003726400434970855712890625|
      (%i3) fpprec : 26$
      (%i4) printf(true, "|~h|~%", sqrt(2))$
      |1.4142135623730950488016887|
      (%i5) fpprec : 24$
      (%i6) printf(true, "|~h|~%", sqrt(2))$
      |1.41421356237309504880169|
      (%i7) printf(true, "|~28h|~%", sqrt(2))$
      |   1.41421356237309504880169|
      (%i8) printf(true, "|~28,,,,,'*h|~%", sqrt(2))$
      |***1.41421356237309504880169|
      (%i9) printf(true, "|~,18h|~%", sqrt(2))$
      |1.414213562373095049|
      (%i10) printf(true, "|~,,,-3h|~%", sqrt(2))$
      |1414.21356237309504880169b-3|
      (%i11) printf(true, "|~,,2,-3h|~%", sqrt(2))$
      |1414.21356237309504880169b-03|
      (%i12) printf(true, "|~20h|~%", sqrt(2))$
      |1.41421356237309504880169|
      (%i13) printf(true, "|~20,,,,'+h|~%", sqrt(2))$
      |++++++++++++++++++++|

Funktion: readbyte (stream)

  Entfernt das erste Byte aus dem binären Eingabestrom stream und gibt es zurück. Ist das Ende der Datei (EOF) erreicht, wird `false` zurück gegeben.

  Beispiel: Die ersten 16 Byte aus einer mit AES in OpenSSL verschlüsselten Datei werden gelesen und ausgewertet.

      (%i1) ibase: obase: 16.$

      (%i2) in: openr_binary("msg.bin");
      (%o2)                       #<input stream msg.bin>
      (%i3) (L:[],  thru 16. do push(readbyte(in), L),  L:reverse(L));
      (%o3) [53, 61, 6C, 74, 65, 64, 5F, 5F, 88, 56, 0DE, 8A, 74, 0FD, 0AD, 0F0]
      (%i4) close(in);
      (%o4)                                true
      (%i5) map(ascii, rest(L,-8));
      (%o5)                      [S, a, l, t, e, d, _, _]
      (%i6) salt: octets_to_number(rest(L,8));
      (%o6)                          8856de8a74fdadf0

Funktion: readchar (stream)

  Entfernt und gibt das erste Schriftzeichen in stream zurück. Falls das Ende des Streams erreicht sein sollte, gibt `readchar` `false` zurück.

  Beispiel: Siehe make_string_input_stream.

Function: readline (stream)

  Gibt die Zeichenkette zurück, die sämtliche Zeichen von der aktuellen Position in stream bis zum Ende der Zeile enthält oder `false`, falls das Ende der Datei erreicht wurde.

Funktion: sprint (expr_1, …, expr_n)

  Wertet ihre Argumente der Reihe nach von links nach rechts aus und gibt sie dann auf einer Linie aus. Zeilenbegrenzungen werden dabei außer Acht gelassen. An die ausgegebenen Ausdrücke wird jeweils rechts ein Leerzeichen angefügt.

  Beispiel: Sequentielle Ausgabe mit `sprint`. Zeilenumbrüche werden hier mit `newline()` erzeugt.

      (%i1) for n:0 thru 19 do sprint(fib(n))$
      0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
      (%i2) for n:0 thru 22 do (
               sprint(fib(n)),
               if mod(n,10) = 9 then newline() )$
      0 1 1 2 3 5 8 13 21 34
      55 89 144 233 377 610 987 1597 2584 4181
      6765 10946 17711

Funktion: writebyte (byte, stream)

  Schreibt das Byte byte in den binären Ausgabestrom stream. `writebyte` gibt `byte` zurück.

  Beispiel: Es werden Bytes in eine Binärdatei geschrieben. In diesem Beispiel entsprechen sämtliche Bytes druckbaren Zeichen, die mit Hilfe von `printfile` ausgegeben werden können. Die Bytes verbleiben so lange im Datenstrom, bis die Funktionen `flush_output` oder `close` aufgerufen werden.

      (%i1) ibase: obase: 16.$

      (%i2) bytes: string_to_octets("GNU/Linux");
      (%o2)                [47, 4E, 55, 2F, 4C, 69, 6E, 75, 78]
      (%i3) out: openw_binary("test.bin");
      (%o3)                      #<output stream test.bin>
      (%i4) for i thru 3 do writebyte(bytes[i], out);
      (%o4)                                done
      (%i5) printfile("test.bin")$

      (%i6) flength(out);
      (%o6)                                  0
      (%i7) flush_output(out);
      (%o7)                                true
      (%i8) flength(out);
      (%o8)                                  3
      (%i9) printfile("test.bin")$
      GNU
      (%i0A) for b in rest(bytes,3) do writebyte(b, out);
      (%o0A)                               done
      (%i0B) close(out);
      (%o0B)                               true
      (%i0C) printfile("test.bin")$
      GNU/Linux

Next: Schriftzeichen, Previous: Einführung in die Verarbeitung von Zeichenketten, Up: stringproc [Contents][Index]