当前位置: 首页 > news >正文

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//返回
http://www.dtcms.com/a/275340.html

相关文章:

  • C++ Map 和 Set 详解:从原理到实战应用
  • 基于 Python 的数据分析技术综述
  • 2025 全球酒店用品厂家竞争力排行榜发布:扬州卓韵领衔,布草工厂实力重塑行业格局
  • 未来软件开发的新方向:从工程到智能的深度演进
  • 利用scale实现图片放大案例
  • 商业机密保卫战:如何让离职员工带不走的客户资源?
  • TCP的socket编程
  • 【unity实战】在Unity实现低耦合可复用的交互系统
  • 科技驯服烈日狂沙:中东沙漠农场的光储革命
  • SQL server之版本的初认知
  • 江协科技STM32入门教程——通信接口
  • 希尔排序和选择排序及计数排序的简单介绍
  • 数据湖和数据库对比
  • 笔记-分布式计算基础
  • 可穿戴智能硬件在国家安全领域的应用
  • day4--上传图片、视频
  • WebGL简易教程——结语
  • JVM--虚拟线程
  • 【springcloud】快速搭建一套分布式服务springcloudalibaba(四)
  • leetcode:HJ18 识别有效的IP地址和掩码并进行分类统计[华为机考][字符串]
  • 华为IPD(集成产品开发)流程是其研发管理的核心体系
  • 华为 GaussDB :技术特性、应用局限与市场争议
  • Vue Vue-route (5)
  • C++11的整理笔记
  • 快速排序递归和非递归方法的简单介绍
  • Java文件传输要点
  • 接口测试及常用接口测试工具总结
  • 啤酒自动装箱机构设计cad【10张】+三维图+设计说明书
  • 138-EMD-KPCA-CPO-CNN-BiGRU-Attention模型!
  • Java——面向对象