使用get_current_dir_name()拼接路径时JsonCpp无法找到JSON文件问题
问题原因与解决方案
1 最常见根因:路径拼接缺失目录分隔符
get_current_dir_name() 返回的当前工作路径末尾不会自动携带 / 目录分隔符,例如当前工作目录为 /home/xxx/project,直接拼接directory/file.json后得到的实际路径是 /home/xxx/projectdirectory/file.json,和你预期的路径不符。你打印时看到两个路径一致,大概率是终端输出时隐藏了不可见字符、换行截断或者显示误差导致的。
修复代码如下:
char* cwd = get_current_dir_name(); std::string plan(cwd); free(cwd); // 注意释放malloc申请的内存,避免泄漏 plan += "/directory/file.json"; // 手动补充目录分隔符
2 次常见原因:运行时工作目录不符合预期
get_current_dir_name() 获取的是程序运行时的当前工作目录,而非程序二进制文件本身的存储目录。如果出现以下场景,会导致获取的工作目录和你手动写路径时参考的目录不一致:
- 在IDE中启动程序,IDE默认配置的工作目录不是你以为的目录
- 在其他路径下通过相对/绝对路径调用程序,比如你在
/home/xxx目录下执行./project/bin/a.out,此时获取的工作目录是/home/xxx,而非程序所在的/home/xxx/project/bin目录
3 进一步排查方案
如果修改后仍然有问题,可以逐字符对比两个路径,不要仅依赖肉眼看打印结果:
std::string auto_path = [自动拼接生成的路径]; std::string manual_path = [你手动填写的完整路径]; if (auto_path == manual_path) { std::cout << "路径完全一致" << std::endl; } else { std::cout << "路径存在差异,自动路径长度:" << auto_path.size() << ",手动路径长度:" << manual_path.size() << std::endl; // 逐字符输出差异 for (int i = 0; i < std::min(auto_path.size(), manual_path.size()); i++) { if (auto_path[i] != manual_path[i]) { std::cout << "第" << i << "位字符不同:自动路径为'" << auto_path[i] << "',手动路径为'" << manual_path[i] << "'" << std::endl; } } }
内容的提问来源于stack exchange,提问作者NotALolicon
相关产品推荐
相关产品推荐

