Nächste: Schriftzeichen, Vorige: Einführung in die Verarbeitung von Zeichenketten, Nach oben: stringproc [Inhalt][Index]
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.
Schließt den Datenstrom stream und gibt true
zurück,
wenn stream noch geöffnet war.
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 .
Leert den Inhalt des Dateiausgabestroms stream in die Datei.
Beispiel: Siehe writebyte .
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.
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.
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 .
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)$
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)$
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.
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.
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.
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.
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))$ |++++++++++++++++++++|
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
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.
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.
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
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: Schriftzeichen, Vorige: Einführung in die Verarbeitung von Zeichenketten, Nach oben: stringproc [Inhalt][Index]