我想从输入文件中读取,我的代码如下:
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 ++的新手
提前致谢:)
答案 0 :(得分:1)
在命令行中使用Q1。当我打印argc时,argc = 3?魔法3来自哪里?
argc
和argv
将输入传递给您的程序。 argc
存储传递的输入数量,argv
存储输入值。
argv
被声明为char*[]
,也就是说指向char的指针数组。这意味着您传递的每个输入,不依赖于其性质(数字,字符或其他任何内容)将被视为char*
,并将成为该向量的元素。
从命令行,您可以执行您的程序输入:
./myProgram input1 input2
现在,input1
和input2
将作为参数传递给您的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;
}