C++环境变量启动程序时传递文件路径及CMD目录文件读写问题
解决文件编解码项目的命令行路径问题
我来帮你搞定这个问题!先把核心逻辑和代码修正点梳理清楚:
1. 关于CMD当前目录的处理
其实你不用特意“获取”这个目录——当你在CMD里启动程序时,程序的**当前工作目录(CWD)**默认就是你打开CMD时所在的目录。所以:
- 当用户输入
myapp test.txt -code时,argv[1]的test.txt会直接指向当前目录下的对应文件,直接用它调用ReadAllBytes就行。 - 如果要把结果保存到当前目录,只要给
WriteAllBytes传相对文件名(比如coded.gau),文件就会自动存在这个目录里。
如果你确实需要显式获取当前目录的路径,可以用Windows的_getcwd函数:
#include <direct.h> #include <string> int main() { char buffer[FILENAME_MAX]; if (_getcwd(buffer, sizeof(buffer)) != NULL) { std::string current_dir(buffer); std::cout << "当前工作目录: " << current_dir << std::endl; } // ... 其他逻辑 }
2. 你的代码需要修正的关键问题
看了你的代码,有几个影响功能的点得改:
- 字符串比较错误:
argv[2]是char*类型,不能直接用==和字符串字面量比,得用strcmp函数。 - 解码文件名重复:你解码时也把结果写到
coded.gau,会覆盖编码后的文件,建议改成decoded.gau。 - 参数校验缺失:没判断用户输入的参数数量是否正确,容易崩。
- 异常处理太笼统:
catch (...)不利于调试,建议优先捕获具体异常。
修改后的完整代码示例
#include <iostream> #include <string> #include <cstring> // 引入strcmp的头文件 // 假设你的ReadAllBytes、Code、Decode等工具函数已正确实现 int main(int argc, char *argv[]) { // 先校验参数数量是否合法 if (argc != 3) { std::cout << "用法错误!正确格式: myapp <文件名> <code/c/decode/d>" << std::endl; return 1; } std::cout << "正在处理文件: " << argv[1] << std::endl; if (strcmp(argv[2], "code") == 0 || strcmp(argv[2], "c") == 0) { try { auto raw_data = ReadAllBytes(argv[1]); auto encoded_str = Code(CharVectorToString(raw_data)); WriteAllBytes("coded.gau", StringToCharVector(encoded_str)); std::cout << "编码完成!结果已保存到当前目录的coded.gau" << std::endl; } catch (const std::exception& e) { std::cout << "编码异常: " << e.what() << std::endl; } catch (...) { std::cout << "未知编码异常!" << std::endl; } } else if (strcmp(argv[2], "decode") == 0 || strcmp(argv[2], "d") == 0) { try { auto encoded_data = ReadAllBytes(argv[1]); auto decoded_str = Decode(CharVectorToString(encoded_data)); WriteAllBytes("decoded.gau", StringToCharVector(decoded_str)); std::cout << "解码完成!结果已保存到当前目录的decoded.gau" << std::endl; } catch (const std::exception& e) { std::cout << "解码异常: " << e.what() << std::endl; } catch (...) { std::cout << "未知解码异常!" << std::endl; } } else { std::cout << "无效参数!请输入code/c或decode/d" << std::endl; return 1; } return 0; }
测试提示
打开CMD,切换到你放测试文件的目录,直接运行myapp test.txt -code,就能在该目录下看到生成的coded.gau;运行myapp coded.gau -decode,就能得到decoded.gau啦。
内容的提问来源于stack exchange,提问作者PING_LORD
相关产品推荐
相关产品推荐

