如何让命令行读取C中的文件路径和变量

时间:2013-07-10 12:34:51

标签: c command-line command-line-arguments command-prompt

我正在尝试从C中的命令行运行程序,并且需要输入文件目录并输入变量。我正在尝试使用stricmp函数来读取键入命令行的代码,但我不知道如何让它读取文件(我读到的文件路径你应该放“r”)并执行计算。我在思考scanf,我也需要能够输入变量。如果有人能看到我的代码并给我一些指示,我会非常感激。谢谢!

int main(int argc, char *argv[])
{
    int i = 0;

    for(i < argc; i++;)

    {

    if(0 == stricmp("Interrogator MLV_PLV_179 r %s %s", argv[i]))
    {
        InterrogatorProtocol1553Flag = TRUE;
        // Set DMV-179
        Interrogator_OFP_Select = INT_OFP_DMV_179;
        // Set MLV/PLV  (Dim S-Record File)
        DirectFlashProgFlag = FALSE;
        // Set Fill Type to 1
        Interrogator_PIR_OFP_FOP = 3;
        Interrogator_PIR_ProgramID = (Interrogator_PIR_T_I     << 11) |
                                             (Interrogator_PIR_OFP_FOP <<  5) |
                                              Interrogator_PIR_RT_Address;
    }

    else if(0 == stricmp("Interrogator DirectFlash r r %s %s", argv[i]))
    {
        InterrogatorProtocol1553Flag = TRUE; 
        Interrogator_OFP_Select = INT_OFP_DMV_179;
        DirectFlashProgFlag = TRUE;
        CreateInterrogatorFlashImage;
    }

    else if(0 == stricmp("Interrogator MLV_PLV_183 r %s %s", argv[i]))
    {
        InterrogatorProtocol1553Flag = TRUE; 
        // Set DMV-183
        Interrogator_OFP_Select = INT_OFP_DMV_183; 
        // Set MLV/PLV  (Dim S-Record File)
        DirectFlashProgFlag = FALSE;
        // Set Fill Type to 6
        Interrogator_PIR_OFP_FOP = 6;
        Interrogator_PIR_ProgramID = (Interrogator_PIR_T_I     << 11) |
                                             (Interrogator_PIR_OFP_FOP <<  5) |
                                              Interrogator_PIR_RT_Address;
    }

    else if(0 == stricmp("Interrogator SRecord r r %s %s", argv[i]))
    {
        InterrogatorProtocol1553Flag = TRUE; 
        Interrogator_OFP_Select = INT_OFP_DMV_183;
        DirectFlashProgFlag = TRUE;
        CreateIntermediateSRecordFile;
    }

    else
    {
        fprintf(stderr, "Unknown parameter: %s", argv[i]);
    }

    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

命令行上的每个参数都作为单独的argv条目传入。假设我已经理解了你的参数应该是什么意思,我希望你的代码看起来更像这样:

if(0 == stricmp("Interrogator", argv[i]))
    InterrogatorProtocol1553Flag = TRUE;
else if(0 == stricmp("MLV_PLV_179", argv[i]))
    Interrogator_OFP_Select = INT_OFP_DMV_179;
else if(0 == stricmp("MLV_PLV_183", argv[i]))
    Interrogator_OFP_Select = INT_OFP_DMV_183; 
else if(0 == stricmp("DirectFlash", argv[i]))
    DirectFlashProgFlag = TRUE;
...

在开始循环之前,您将使用默认值初始化这些变量,这些默认值在未设置各种参数时使用。

如果您的某个参数是文件名,那么您需要某种方式来指示它是哪一个。一个简单的选择是使其成为命令行的最后一个值。所以你会得到这样的文件名:

filename = argv[argc-1];

在这种情况下,读取所有其他参数的循环应该只会达到argc-1,否则文件名将被解释为无法识别的参数,您将收到错误。

答案 1 :(得分:0)

你的问题不明确。

如果您需要从标准输入(键盘)输入,请使用scanf。如果您需要从文件输入,请使用fscanf。它们之间只有一个区别:fscanf有一个额外的第一个FILE*参数,它是指向表示文件的结构的指针。您可以像这样获取文件:

FILE* f = fopen("C:/file.txt", "r"); // 'r' means the file is used for reading