You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:02:15