MODULE UnixDateien; IMPORT Read, Write, Conclusions, Strings, Streams, UnixFiles, StreamDisciplines; VAR file, string: ARRAY 256 OF CHAR; filestream, stringstream: Streams.Stream; i: INTEGER; BEGIN Write.Ln; (* Schreiben auf stdout *) Write.String("Hallo "); Write.Ln; Write.String("Welt"); (* Schreiben in eine Datei, verwenden von streams *) file := "test1.txt"; IF UnixFiles.Open(filestream, file, 4+1, 1, NIL) THEN (* 4+1 steht an Stelle der mode Variablen, * 1 bedeutet schreibender Zugriff, * 4 bedeutet die create Option setzen, siehe auch * Skript S.39. * Weitere Optionen koennen durch aufsummieren der Zahlen * gebildet werden. So bedeutet z.B. 8+1 = 9 write und * condcreate Option usw... *) Write.StringS(filestream, "Hallo "); Write.LnS(filestream); Write.StringS(filestream, "Welt"); Write.LnS(filestream); END; IF Streams.Close(filestream) THEN END; file := "test2.txt"; IF UnixFiles.Open(filestream, file, 4+1, 1, NIL) THEN Write.StringS(filestream, "Hallo:Mein:Name:Ist:R2D2"); Write.LnS(filestream); END; IF Streams.Close(filestream) THEN END; (* Den kompletten String aus der Datei test2.txt lesen und ausgeben * Anstelle der 0 fuer read kann auch UnixFiles.read stehen. * UnixFiles.read wird dann einfach vom Compiler durch eine 0 ersetzt. *) IF UnixFiles.Open(filestream, file, UnixFiles.read, 1, NIL) THEN WHILE ~filestream.eof DO Read.StringS(filestream, string); Write.Ln; Write.String(string); END; END; IF Streams.Close(filestream) THEN END; IF UnixFiles.Open(filestream, file, UnixFiles.read, 1, NIL) THEN (* Hier wird als Zeilentrenner der : definiert. * Mit Read.Field ist es dann moeglich innerhalb einer * Zeile alle "Felder" auszulesen. Read.Field arbeitet * immer nur auf einer Zeile. Sind wir am Zeilenende * angelangt, gibt es keine Felder mehr und Read.Field * liefert False zurueck. * DESHALB ACHTUNG: Am Schluss muss ein Read.LnS stehen, * um in die naechste Zeile zu springen! *) StreamDisciplines.SetFieldSep(filestream, ":"); WHILE ~filestream.eof DO IF Read.FieldS(filestream, string) THEN Write.Ln; Write.String(string); END; IF Read.FieldS(filestream, string) THEN Write.Ln; Write.String(string); END; IF Read.FieldS(filestream, string) THEN Write.Ln; Write.String(string); END; Read.LnS(filestream); END; END; IF Streams.Close(filestream) THEN END; file := "test3.txt"; IF UnixFiles.Open(filestream, file, 4+1, 1, NIL) THEN Write.Ln; Write.StringS(filestream, "HalloMeinNameIst:R:2:D:2"); Write.LnS(filestream); END; IF Streams.Close(filestream) THEN END; IF UnixFiles.Open(filestream, file, UnixFiles.read, 1, NIL) THEN StreamDisciplines.SetFieldSep(filestream, ":"); WHILE ~filestream.eof DO (* Read.Field liest nur Strings aus, d.h. * auch Zahlen werden als Strings gelesen. Wie * diese Zahlen in INTEGER umgewandelt werden * siehe naechster Kommentar. *) IF Read.FieldS(filestream, string) THEN Write.Ln; Write.String(string); END; IF Read.FieldS(filestream, string) THEN Write.Ln; Write.String(string); END; (* Umwandlung eines strings in eine Zahl *) (* entsprechendes Feld aus der Datei (also aus dem Stream filestream) lesen und in der Variablen string speichern *) IF Read.FieldS(filestream, string) THEN (* die Variable string wieder in einen stream umwandeln *) Strings.Open(stringstream,string); (* und zuletzt den stream in eine INTEGER Zahl (hier i) umwandeln. *) Read.IntS(stringstream, i); Write.Ln; Write.Int(i, 1); END; IF Streams.Close(stringstream) THEN END; Read.LnS(filestream); END; END; IF Streams.Close(filestream) THEN END; Write.Ln; Write.Ln; END UnixDateien.