如何从argc中读取文件

时间:2017-10-06 06:41:46

标签: c++ file readfile

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

    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 个答案:

答案 0 :(得分: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
...

注意: 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;
}