首页 文章

如何从argc中读取文件

提问于
浏览
-3

我想从输入文件中读取,我的代码如下:

int main(int argc, char* argv[])
    {
     /* 1st arg: input file name , 2nd arg: output file name */
     cout<<argc<<endl;

     ifstream input_file;

     input_file.open(argc);

     return 0;
     }

Q1 . 当我打印argc时,argc = 3?魔法3来自哪里?

Q2 . 由于argc的类型是int,我应该将argc读取为const char *,然后输入input_file.open()吧?

Q3 . argv是我的输出名称,但为什么argv []的类型是char * . 我希望argv的类型是字符串,因为输出文件的名称是字符串

我是C的新手

提前致谢 :)

1 回答

  • 1

    Q1 . 当我打印argc时,argc = 3?魔法3来自哪里?

    在命令行中使用 argcargv 将输入传递给程序 . argc 存储传递的输入数量, argv 存储输入值 .

    argv 被声明为 char*[] ,也就是说指向char的指针数组 . 这意味着您传递的每个输入,独立于其性质(数字,字符或其他)将被视为 char* ,并将成为该向量的元素 .

    从命令行,您可以执行您的程序输入:

    ./myProgram input1 input2
    

    现在, input1input2 将作为参数传递给您的main函数 . argv 将等于您输入1的输入数字,因为程序名称实际上被视为程序的输入 . 在这种情况下,您传递2个输入,因此 argv = 3 .

    Q2 . 由于argc的类型是int,我应该将argc读取为const char *,然后输入input_file.open()吧?

    不,您应该以这种方式阅读您的输入:

    input_file.open(argv[1]);  // <-- input1 is located at index 1
    output_file.open(argv[2]);  // <-- input1 is located at index 2
    

    Q3 . argv是我的输出名称,但为什么argv []的类型是char * . 我希望argv的类型是字符串,因为输出文件的名称是字符串

    您应该清楚所有输入都存储在 argv[] 中,并且您可以通过数组轻松访问每个输入:

    argv[1] = imput1
    argv[2] = imput2
    argv[3] = imput3
    ...
    

    Note: argc 通常用于if条件,以避免访问非法内存区域 . 考虑以下程序:

    int main(int argc, char* argv[])
    {
        std::cout << argv[1];
        std::cout << argv[2];
        std::cout << argv[3];
    
        return 0;
    }
    

    如果您执行程序:

    ./myProgram input1 input2

    你可能会得到一个分段错误错误,因为你试图访问不存在的 argv[3] ,因为数组 argv 只有3个元素 .

    您可以使用 argc 防止此崩溃:

    int main(int argc, char* argv[])
    {
        if (argc == 4)
        {
            std::cout << argv[1];
            std::cout << argv[2];
            std::cout << argv[3];
        }
        else 
            std::cout << "Please, provide 3 inputs." << std::endl;
        return 0;
    }
    

相关问题