The OPEN statement’s FILE= specifier establishes the association of a logical unit to a named, physical file at runtime. This file can be pre-existing or created by the program.
The FILE= specifier on an OPEN statement may specify a simple file name (FILE=’myfile.out’) or a file name preceded by an absolute or relative directory path (FILE=’../Amber/Qproj/myfile.out’). Also, the specifier may be a character constant, variable, or character expression.
Library routines can be used to bring command-line arguments and environment variables into the program as character variables for use as file names in OPEN statements.
The following example (GetFilNam.f) shows one way to construct an absolute path file name from a typed-in name. The program uses the library routines GETENV, LNBLNK, and GETCWD to return the value of the $HOME environment variable, find the last non-blank in the string, and determine the current working directory:
CHARACTER F*128, FN*128, FULLNAME*128 PRINT*, ’ENTER FILE NAME:’ READ *, F FN = FULLNAME( F ) PRINT *, ’PATH IS: ’,FN END CHARACTER*128 FUNCTION FULLNAME( NAME ) CHARACTER NAME*(*), PREFIX*128 C This assumes C shell. C Leave absolute path names unchanged. C If name starts with ’~/’, replace tilde with home C directory; otherwise prefix relative path name with C path to current directory. IF ( NAME(1:1) .EQ. ’/’ ) THEN FULLNAME = NAME ELSE IF ( NAME(1:2) .EQ. ’~/’ ) THEN CALL GETENV( ’HOME’, PREFIX ) FULLNAME = PREFIX(:LNBLNK(PREFIX)) // 1 NAME(2:LNBLNK(NAME)) ELSE CALL GETCWD( PREFIX ) FULLNAME = PREFIX(:LNBLNK(PREFIX)) // 1 ’/’ // NAME(:LNBLNK(NAME)) ENDIF RETURN END |
Compiling and running GetFilNam.f results in:
demo% pwd /home/users/auser/subdir demo% f95 -o getfil GetFilNam.f demo% getfil ENTER FILE NAME: getfil PATH IS: /home/users/auser/subdir/atest.f demo% |
These routines are further described in 2.1.4 Passing File Names to Programs. See man page entries for getarg(3F), getcwd(3F), and getenv(3F) for details; these and other useful library routines are also described in the Fortran Library Reference.