Nächste: , Vorige: , Nach oben: stringproc   [Inhalt][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

Nächste: , Vorige: , Nach oben: stringproc   [Inhalt][Index]