For POSIX systems, I found three solutions:
Get value from "PWD" environment variables
#include <stdio.h> #include <stdlib.h> #ifdef __unix__ #define IS_POSIX 1 #else #define IS_POSIX 0 #endif int main (int argv, char **argc) { if (IS_POSIX == 1) { puts("Path info by use environment variable PWD:"); printf("\tWorkdir: %s\n", getenv("PWD")); printf("\tFilepath: %s/%s\n", getenv("PWD"), __FILE__); } return 0; }
Result:
Path info by use environment variable PWD: Workdir: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils Filepath: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils/main.c
Use getcwd ()
#include <stdio.h> #include <stdlib.h> #ifdef __unix__ #define IS_POSIX 1 #include <unistd.h> #else #define IS_POSIX 0 #endif int main (int argv, char **argc) { if (IS_POSIX == 1) { char cwd[1024]; getcwd(cwd, sizeof(cwd)); puts("Path info by use getcwd():"); printf("\tWorkdir: %s\n", cwd); printf("\tFilepath: %s/%s\n", cwd, __FILE__); } return 0; }
Result
Path info by use getcwd(): Workdir: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils Filepath: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils/main.c
Run the system command "pwd" and read the output
#ifdef __unix__ #define IS_POSIX 1 #define _BSD_SOURCE #else #define IS_POSIX 0 #endif #include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argv, char **argc) { if (IS_POSIX == 1) { char buffer[500]; FILE *output; // read output of a command output = popen("/bin/pwd", "r"); char *pwd = fgets(buffer, sizeof(buffer), output); // strip '\n' on ending of a line pwd = strtok(pwd, "\n"); puts("Path info by execute shell command 'pwd':"); printf("\tWorkdir: %s\n", pwd); printf("\tFilepath: %s/%s\n", pwd, __FILE__); } return 0; }
Result:
Path info by execute shell command 'pwd': Workdir: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils Filepath: /media/setivolkylany/WorkDisk/Programming/Projects/c-utils/main.c