In Dateien werden Informationen permanent aufbewahrt. Man kommt an sie heran, indem man eine Datei über den Befehl open öffnet und mit dem Befehl read ausliest. Das ist, als wenn man ein Haus betritt, indem man die Haustür öffnet und dann die Zimmer anschaut.
Nach einem open folgt natürlich ein close. Die Tür wird wieder zugemacht.
Auf einer Festplatte können Millionen von Dateien herumliegen. Man will ja nur eine bestimmte öffnen. Das geht über ihren Namen file = „…“. Die Dateiendung kann willkürlich gewählt werden, sollte jedoch nicht mit bestimmten gängigen Programmendungen verwechselbar sein. Man könnte versehentlich solche wichtigen Dateien gnadenlos überschreiben. Ich gebrauche die Dateiendung txt. Der Texteditor öffnet sie ohne Probleme.
Beispiel
file = „neu.txt“
Vor der Angabe des Dateinamens muss eine Kanalnummer für die Datei angegeben werden. Das ist irgendeine natürliche Zahl. Sie steht hinter dem Schlüsselwort unit = …
Beispiel
open(unit = 2, file = „neu.txt“)
Der Fortran-Compiler kann man unter dieser Kanalnummer 2 auf die Datei neu.txt zugreifen. Es sind noch weitere Befehle nötig, mit der diese Datei bearbeitet wird. Bei ihnen ist dann diese Kanalnummer in Klammern angegeben.
Es könnte ja sein, man hat viele Dateien. Dann kriegt jede Datei eine eigene Kanalnummer. Im Code kannst du ersehen, welche Datei betroffen ist.
Schreiben von Daten
Daten werden in eine Datei über den Befehl write geschrieben. In Klammern steht vorne die Kanalnummer und durch Komma getrennt ein Stern *. Nach der schließenden Klammer steht ein Leerschritt. Dahinter folgen die Angaben, die in die Datei gespeichert werden sollen. Sie werden mit einem Komma abgetrennt.
Beispiel
In die Datei neu.txt sollen die quadratischen und kubischen Potenzen der Zählervariablen i geschrieben werden.
Für die Kanalnummer habe ich einfach die Zahl 2 gewählt, unit = 2.
Nach dem Start des Fortran-Programms wird eine Datei angelegt. Der Compiler zeigt eine Meldung. Es steht aber dort nichts darüber, dass die Datei erzeugt wurde, nur dass der Lauf ok war.
Im Verzeichnis, wo sich die Projektdateien befinden, wurde die Datei neu.txt abgelegt. Ich habe sie mit dem Texteditor geöffnet.
In der ersten Spalte wird der Zählerwert i angezeigt, dahinter sein Quadrat und als dritte Spalte die errechnete Kubikzahl.
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.
Ergebnis nach dem Programmstart:
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.
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.
In der erzeugten Datei neu1.txt stehen dann diese Werte.
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.
Nach dem Start gibt es diese Meldung: „invalid memory references.“