Is there an alternative to GETCWD() in Fortran 2003-2008
As noted in the comments, you can make use of get_environment_variable
which is standard Fortran (e.g. F2008 13.7.67). This example program queries the value of $PWD
, which should contain the directory your shell is in when you invoked the executable.
program test
implicit none
character(len=128) :: pwd
call get_environment_variable('PWD',pwd)
print *, "The current working directory is: ",trim(pwd)
end program
And its output:
casey@convect code % pwd
/home/casey/code
casey@convect code % so/getpwd
The current working directory is: /home/casey/code
This is standard Fortran, but its portability will be limited to Unix and Unix-like shells that set this variable.
Another option while standard but ugly (in my opinion) would be to use execute_command_line
to run a command that can output the working directory to a temporary file (e.g. pwd > /tmp/mypwd
), then reading that file.
You can also use the ISO_C_Binding
and call the corresponding C
functions:
cwd.c:
#ifdef _WIN32
/* Windows */
#include <direct.h>
#define GETCWD _getcwd
#else
/* Unix */
#include <unistd.h>
#define GETCWD getcwd
#endif
void getCurrentWorkDir( char *str, int *stat )
{
if ( GETCWD(str, sizeof(str)) == str ) {
*stat = 0;
} else {
*stat = 1;
}
}
test.F90:
program test
use ISO_C_Binding, only: C_CHAR, C_INT
interface
subroutine getCurrentWorkDir(str, stat) bind(C, name="getCurrentWorkDir")
use ISO_C_Binding, only: C_CHAR, C_INT
character(kind=C_CHAR),intent(out) :: str(*)
integer(C_INT),intent(out) :: stat
end subroutine
end interface
character(len=30) :: str
integer(C_INT) :: stat
str=''
call getCurrentWorkDir(str, stat)
print *, stat, trim(str)
end program
This code is valid for Windows and Unix-derivates (Linux, OSX, BSD, etc. )