file_io_usb.mws

Einlesen von Daten aus Dateien und Schreiben von Daten auf Dateien

Zur Vorbereitung für das folgende Beispiel wurde unter Windows eine einfache Text-Datei (ASCII-Datei) namens testdaten.txt in einem Verzeichnis E:\Maple11\V7\messdaten\  mit Hilfe eines Editors (Editor/Notepad) erstellt.
Der Inhalt der Datei ist der folgende:
# x y

0   2.54
1   3.51
1.9 4.4
3.1 5.6

>    restart:ssystem("dir e:");
 

[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,

Mit ssystem( ) erfolgen vom Maple aus Zugriffe auf das Betriebssystem des Rechners.
Unter Windows können hier die MSDOS-Befehle; bei Unix als Betriebssystem dementsprechend Unix-Anweisungen eingegeben werden.

Der erste Wert im Maple-Output (im obigen Fall die 0) ist der Rückgabewert der aufgerufenen Betriebssystem-Operation. Falls Sie hier eine 0 als Rückgabewert erhalten, konnte das Betriebssystem die verlangte Operation fehlerfrei durchführen. Sobald Sie als Rückgabewert von ssystem( ) eine Zahl ungleich 0 erscheint, trat während das Betriebssystem die Anweisung "dir e:"  ausführen wollte, ein Fehler auf.

Um eine Fehlersituation zu demonstieren, wird nun ein auf dem Rechner nicht angelegter Laufwerksbuchstabe eingegeben:

>    ssystem("dir g:");

[1,

Wir lassen uns nochmals das Inhaltsverzeichnis des angeschlossenen USB-Sticks angeben:

>    ssystem("dir e:");

[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,

Das 2. Element in der Rückgabeliste entspricht genau dem, was man bei Aufruf des Befehls in der MSDOS- Umgebung (unter XP z.B. zu erreichen mit Button Start -> Ausführen  und cmd  eintippen und dann die RETURN-Taste drücken) erhalten würde

[Maple Bitmap]

Man sieht, dass auf dem USB-Stick u.a. ein Verzeichnis namens Maple11  liegt. Dieses Verzeichnis wird nun zum Arbeitsverzeichnis gemacht

>    currentdir("e:\\Maple11");

Der Befehl currentdir( ) hat die Eigenheit, dass er als Rückgabewert das zuletzt gewählte Verzeichnis anzeigt. Außerdem ist in Maple unter Windows der Pfad mit doppelten Backslashes anzugeben.

>    currentdir( );

zeigt das Verzeichnis an, in dem man sich gerade befindet. Den Inhalt des aktuellen Verzeichnises kann man sich mit

>    ssystem("dir");

[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,

Es wird nun noch in das Verzeichnis V7\messdaten gewechselt (diesmal mit der relativen statt der absoluten Pfadangabe)

>    currentdir("V7\\messdaten"): currentdir();

Den Inhalt einer Text-Datei (ASCII)-Datei kann man sich unter Windows mit  

>    ssystem("type testdaten.txt");

[0,
[0,
[0,
[0,
[0,
[0,

wenigstens grob anzeigen lassen. Diese zweispaltige Wertetabelle soll nun eingelesen werden

Mit dem Kommentarzeichen #  am Beginn der Zeile markierte Zeilen werden dabei überlesen, so dass man auf diese Art und Weise in die Messwertedatei Informationen zu den dort abgelegten Daten einfach hinzufügen kann.

>    daten := readdata("testdaten.txt",[float,float]);

daten := [[0., 2.54], [1., 3.51], [1.9, 4.4], [3.1, 5.6]]

Die eingelesenen Wertepaare werden nun graphisch dargestellt

>    with(plots):
p1 := listplot(daten,style=point,symbolsize=30,color=red,view=[0..4,0..6]):
display(p1);

[Maple Plot]

Die Werte wurde in die Variable daten als doppelt geschachtelte Liste eingelesen

>    daten;

[[0., 2.54], [1., 3.51], [1.9, 4.4], [3.1, 5.6]]

Auf ein einzelnes Element kann über eine doppelte Indexierung zugegriffen werden

>    daten[1][2];

2.54

Die eingelesenen Daten können mit Maple beliebig weiterverarbeitet werden.
Im Beispiel soll jeweils vom Wert in der 2. Spalte der dekadische Logarithmus gebildet werden

>    for i from 1 to nops(daten) do
     daten[i][2] := log10(daten[i][2]);
end do;

daten[1][2] := .4048337166

daten[2][2] := .5453071165

daten[3][2] := .6434526765

daten[4][2] := .7481880270

Der bearbeitete Datensatz soll nun auf die Diskette unter dem neuen Namen testdaten2 . txt  abgespeichert werden.

Daten auf eine externe Datei schreiben

Das Schreiben einer Datei umfasst 3 Schritte:

1.  Schritt: Öffnen der Datei zum Schreiben einschließlich der  Zuweisung eines File-Descriptors (hier fd  genannt)

2.  Schritt: Schreiben der Werte mit
fprintf. Dabei muss der Name des Filedescriptors, gefolgt von einem Formatbeschreiber (dieser entspricht der Notation in der Programmiersprache C) und dann die Liste der auf die Datei zu schreibenden Werte ausgegeben werden.

3.  Schritt: Mit
fclose(<Name des verwendeten Filedescriptors>) muss der Schreibvorgang abgeschlossen werden.
Erst nachdem
fclose (oder Maple beendet wurde) kann von anderen Programmen aus (z.B. mit einem Editor) auf die Datei zugegriffen werden.

>    fd := fopen("testdaten2.txt",WRITE):
for i from 1 to nops(daten) do
    fprintf(fd,"%g %g\n",daten[i][1],daten[i][2]):
end do:
fclose(fd);

Am geschicktesten ist es, die 3 zusammengehörenden Schritte in eine sogenannte "Execution Group" zu schreiben. Dazu verwendet man am Ende der Anweisungen  um zur nächsten Anweisung überzuwechseln, die Tasten SHIFT RETURN statt nur RETURN, so dass die Anweisungen am linken Rand des Worksheets in einer langen eckigen Klammer (eine "Execution Group") zusammengefasst werden. Steht der Cursor irgendwo innerhalb einer solchen "Execution Group" und es wird RETURN gedrückt, so wird der gesamte Anweisungsblock ausgeführt. Auf diese Art und Weise werden die 3 Schritte als die zusammengehörige Einheit durchgeführt und man kann vermeiden, dass, wenn man im Worksheet wieder nach oben geht, um einzelne Anweisungen zu wiederholen, dass evtl. vergessen wird, den File-Descriptor zuzuweisen oder nach dem Schreiben den File-Descriptor zu schließen.

Hätte man die do-Schleife nicht mit einem Doppelpunkt abgeschlossen, wäre als Maple-Output die Rückgabewerte von fprintf( ) erscheinen (dies entspricht der Anzahl der geschriebenen Zeichen)

>    ssystem("dir");

[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,
[0,

Achtung: für Pfadangaben innerhalb von ssystem brauchen Sie doppelte Backslashes, z.B.

>    ssystem("type testdaten2.txt");

[0,
[0,
[0,
[0,
[0,

Es soll nun in die oberste Wurzel der Verzeichnishierarchie auf dem USB-Stick gewechselt werden:

>    currentdir("e:\\");

>    currentdir( );

Den Inhalt der Datei testdaten2.txt kann man sich nun durch Einfügen des absoluten Pfads zu der Datei in den vorvorletzten Befehl anzeigen lassen

>    ssystem("type e:\\Maple11\\V7\\messdaten\\testdaten2.txt");

[0,
[0,
[0,
[0,
[0,

Vergisst man allerdings die doppelten Backslashes in der Windows-Pfadangabe, so kann der Befehl nicht fehlerfrei ausgeführt werden (Rückgabewert 1 statt 0).

>    ssystem("type e:\Maple11\V7\messdaten\testdaten2.txt");

[1,