Window/linux获得程序运行目录C++
_pgmptr
Windows专属,这是一个字符串,在stdlib.h中:
#ifndef _pgmptr
#ifdef _MSVCRT_extern char *_pgmptr;
#elseextern char ** __MINGW_IMP_SYMBOL(_pgmptr);
#define _pgmptr (* __MINGW_IMP_SYMBOL(_pgmptr))
#endif
#endif
这个东西虽然是字符串常量,但是当程序的文件名改变时,文件的目录发生变化时,也会随之改变。
样例:
#include <stdio.h>
#include <stdlib.h>
int main(){printf("%s\n",_pgmptr);return 0;
}
运行:
getcwd()
这个函数获取的是当前运行目录,没有文件名,在io.h里
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
int main(){char path[PATH_MAX]; getcwd(path,sizeof(path));printf("%s\n",path);return 0;
}
有一个BUG:
// 程序位置: C:\Users\Administrator\Desktop\未命名1.exe
// 执行: C:\Users\Administrator>C:\Users\Administrator\Desktop\未命名1.exe
//返回C:\Users\Administrator
readlink
linux
#include <unistd.h>
#include <linux/limits.h>
#include <stdio.h>
#include <stdlib.h>
int main() {char path[PATH_MAX];ssize_t len = readlink("/proc/self/exe", path, sizeof(path)-1);if (len != -1) {path[len] = '\0';printf("%s", path);}return 0;
}
filesystem(C++17)
高版gcc才能用(QWQ Dev-Cpp用不了,得自己装新版gcc)
#include <filesystem>
#include <string>
#include <windows.h>
std::string get_exec_path() {char path[MAX_PATH];GetModuleFileName(NULL, path, MAX_PATH);return std::filesystem::path(path).string();
}
跨平台:
#include <filesystem>
#include <string>
std::string get_exec_path() {#if defined(_WIN32)#include<windows.h>char path[MAX_PATH];GetModuleFileName(nullptr, path, MAX_PATH);return std::filesystem::path(path).string();#elif defined(__linux__)return std::filesystem::read_symlink("/proc/self/exe");#endif
}
GetModuleFileName
windows专属,能用这个用这个
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(){char path[MAX_PATH];GetModuleFileName(NULL,path,sizeof(path));printf("%s\n",path);return 0;
}
???
比较坑的:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc,char* argv[]){printf("%s\n",argv[0]);return 0;
}
没什么用,返回的很多,当个乐子就好。
C:\Users\Administrator\Desktop\未命名1.exe//调用
C:\Users\Administrator\Desktop\未命名1.exe//返回
Desktop\未命名1.exe//调用
Desktop\未命名1.exe//返回
未命名1.exe//调用
未命名1.exe//返回
\\.\C:\Users\Administrator\Desktop\未命名1.exe//调用
\\.\C:\Users\Administrator\Desktop\未命名1.exe//返回
\\?\C:\Users\Administrator\Desktop\未命名1.exe//调用
\\?\C:\Users\Administrator\Desktop\未命名1.exe//返回