READ-Datei in Fortran

Daten werden aus einer Datei mit dem Befehlt read ausgelesen. Man muss allerdings wissen, welche Struktur diese Dateien haben, sonst kriegt man nur einen unleserlichen "Salat" am Bildschirm zu sehen.

 

Beispiel

 

Aus der bestehenden Datei neu.txt sollen die ersten fünf Zeilen ausgelesen und am Bildschirm dargestellt werden. Deshalb steht bei der DO-Schleife der Endwert 5.

 

Die Zahlen in der Datei werden in spaltenweise in ein Array abgelegt. Sie werden in der Variablen a(5) mit maximal fünf Werten und in der Variablen b(5) auch mit maximal fünf Werten zwischengespeichert.

 

Im Array a befinden sich untereinander bestimmte Zahlen. Das Gleiche gilt für den Array b. In der Mathematik sind das Spaltenvektoren.

 

Diese Zahlen werden am Bildschirm über den Befehl print dargestellt und zwar Zeile für Zeile.

 

 

[image]

 

 

Ergebnis nach dem Programmstart:

 

[image]

 

Versuch 1

 

Ich provoziere einen Fehler, indem ich die Datei neu.txt lösche. Dann findet der Fortran-Compiler diese Datei nicht und wird ärgerlich, was man an dieser Meldung sieht. Wichtig ist die Meldung "could not find executable to open."

 

Oben rechts im Fenster siehst du den Dateinamen file = 'neu.txt". Diese Datei fehlt also. Der Compiler hat eine leere Datei mit diesem Namen auf dem Laufwerk des PC angelegt. Da sie leer ist, kann er sich nicht auslesen. Versuche es mal, indem du das Programm nochmal startest. Es kommt wieder die gleiche Fehlermeldung.

 

[image]

 

Programmvariation

 

Die ausgelesenen Daten sollen in eine andere Datei neu1.txt geschrieben werden. Dazu benutze ich eine neue Kanalnummer unit = 10, die ich frei gewählt habe. Außerdem habe ich mir etwas ausgedacht. Die beiden Spalten sollen summiert werden und zwar Zeile für Zeile.

 

Die Arrays werden addiert a(i) + b(i). Erst werden die Werte für i = 1 addiert und in die Datei geschrieben. Dann kommen die Werte i = 2 dran usw.

 

Bei dem write-Befehl taucht noch der Zähler i auf. Damit will ich dir in der Datei eine Hilfe geben und andeuten, welche Zeile addiert wurde.

 

[image]

 

In der erzeugten Datei neu1.txt stehen dann diese Werte.

 

[image]

 

Vorne steht der Zähler i und dahinter die Summe der beiden Arrays a und b. Es sollten nur fünf Zeilen ausgelesen werden, daher ist die Ausgabe auf fünf Zeilen beschränkt.

 

Versuch 2

 

Ich provoziere einen Laufzeitfehler, indem ich mehr Daten aus den Arrays auslesen will als drin stehen. Die beiden Array haben nur fünf Zeilen. Ich gebe dem Programm vor 20 Zeilen auszulesen, die ja in der Datei neu.txt vorhanden sind.

 

Schau auf die Angaben bei der Deklaration und bei der DO-Schleife. Hier stimmen die Angaben nicht überein!

 

Deklaration:

 

integer :: a(5), b(5)

 

DO-Schleife:

 

do i = 1, 20

 

Achte auf solche Formalien.

 

 

[image]

 

Nach dem Start gibt es diese Meldung: "invalid memory references."

 

[image]