2017-07-16 2 views
0

Wie kann ich aus einem übergeordneten Verzeichnis mit der Klausel OPEN lesen? Sagen wirVerzeichnisnavigation in OPEN-Klausel

OPEN (11,file='../inf/input.dat',form='formatted',status='old') 

, die nicht funktioniert. Ich bekomme:

forrtl: severe (29): file not found, unit 11, file /home/cg/compile/comp/../inf/input.dat 

Ich möchte von dem übergeordneten Verzeichnis vor inf nur lesen. Ist das möglich?

+0

Ich aktualisiere die Post! – Peter

+1

Sie können das nicht direkt in Fortran tun. Sie müssen das aktuelle Verzeichnis als String erhalten und die Manipulation selbst vornehmen. Siehe hier https://StackOverflow.com/Q/30279228/1004168 – agentp

+0

Sorry, ich bin etwas unerfahren mit FORTRAN. Wie könnte ich das tun? Soll ich irgendwo eine CD einbauen oder "streng manuell" meinen? – Peter

Antwort

1

Leider gibt es keine eindeutige Möglichkeit, dies zu tun, da Pfade vom Betriebssystem abhängig sind. Um dies in einer robusten Weise zu erreichen, müssen Sie möglicherweise eine Funktion definieren, die während der Vorverarbeitung nach dem Betriebssystem sucht (vgl. Kompilierungsflags, z. B. here).

Für * nix Systeme (Unix, einschließlich OSX und Linux) die Option, die Sie sollten

../ 

im Weg genügen vorgesehen geht zum vorherigen Verzeichnis.

Aber in Windows gibt es keine Möglichkeit, dass ich in das obige Verzeichnis gehen kann (ich habe im Moment kein Windows-System mit mir). Sie können diese Einschränkung jedoch mit der API GetModuleFileName function umgehen. (Beachten Sie, dass diese in den Systemen nicht über Arbeit wird)

CHARACTER*(*) pathname   ! full name 
INTEGER  L     ! length 
L= GetModuleFileName(NULL,pathname,LEN(pathname)) 

Vollständiger Name wird nun den vollständigen Pfad enthalten, wo Sie Ihr Programm ausführen, so dass Sie alle Arten von String-Operation tun können, die Sie wollen. Wenn Sie über eine Ebene gehen wollen

Idx = index(trim(pathname), '/', .True.) 

Sucht den Index der letzten Zeichen ‚/‘ im Pfadnamen (möglicherweise vor dem letzten für die man suchen müssen).

outfile_path=pathname(:idx)+'/inf/input.dat' 

wird jetzt der Pfad, den Sie möchten.