Sun Studio 12: Fortran Programming Guide

2.1.1 Accessing Named Files

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.