我从C ++ Primer(第5版,Stanley B.Lippman撰写)中读取此代码 此代码用于计算文件中字母的出现时间。
我想知道main函数的2个参数的功能
什么是infile.open(argv[1],infile)
另外,infile.open()
的参数可以不是const吗?如果没有,我如何更改我想从控制台读取的文件,而不是源代码。
这是代码:
//enter code here
void runQueries(ifstream &infile)
{
// infile is an ifstream that is the file we want to query
TextQuery tq(infile); // store the file and build the query map
// iterate with the user: prompt for a word to find and print results
while (true) {
cout << "enter word to look for, or q to quit: ";
string s;
// stop if we hit end-of-file on the input or if a 'q' is entered
if (!(cin >> s) || s == "q") break;
// run the query and print the results
print(cout, tq.query(s)) << endl;
}
}
// program takes single argument specifying the file to query
//enter code here
int main(int argc, char **argv)
{
// open the file from which user will query words
ifstream infile;
// open returns void, so we use the comma operator XREF(commaOp)
// to check the state of infile after the open
if (argc < 2 || !(infile.open(argv[1]), infile)) {
cerr << "No input file!" << endl;
return EXIT_FAILURE;
}
runQueries(infile);
return 0;
}
答案 0 :(得分:2)
我想知道主函数
的2个参数的功能
它们是参数的数量(int argc
),以及指向参数(const char* argv[]
)的指针数组。
请注意,const char* argv[]
和const char** argv
是等效的,但我认为前者更容易理解。
argv[0]
通常包含运行程序的可执行文件的名称。
在您的情况下,您的程序希望第二个参数argv[1]
成为要打开的文件的路径。
例如,如果您按原样运行程序:
$ myprogram file.txt
然后
argc == 2
argv[0] == "myprogram"
argv[1] == "file.txt"
什么是infile.open(argv [1],infile)
这不是它的拼写方式。它实际上是(infile.open(argv[1]), infile)
。这是一种有点复杂的方式(在注释中解释)打开文件,并检查它是否正确打开。这本可以改写为:
if (argc >= 2) {
infile.open(argv[1]);
if (!infile) {
//handle error
}
} else {
// handle error
}
但正如您所看到的,这需要在两个地方使用错误处理。
if (argc < 2)
throw std::runtime_exception("Requires a filename");
ifstream infile(argv[1]); // at this point we can safely assume we can dereference argv[1]
if (!infile)
throw std::runtime_exception ("Cannot open file");
如果我没记错的话,这本书会在后期介绍异常处理,所以你现在不必改变这一切。
另外,infile.open()的参数是不是const?
如果函数需要一个const
的参数,你也可以将一个非常量的参数传递给它(参考除外)。但是,您已经从控制台(标准输入)读取文件名,因此我在这里看不到问题。