在运行时,程序从命令行获取一个或多个参数,每个参数都是要打开的文件的名称。
argc ==文件名的数量。
argv [0] ==该计划的名称。
argv [n],其中n是一个整数==给定的文件名,根据它们从命令行传递的顺序。
next_file前进到要编辑的下一个文件。它增加n,如果n大于argc则退出;因为这意味着已经达到了最后一个文件。否则,它调用file_handler。
file_handler接受一个流对象[file],一个字符串[name]和一个布尔变量[open]。如果open为0,则关闭当前文件。如果open为1,则用[file]打开[name]。
当调用next_file时,预期的行为是它将关闭当前打开的文件,将[n]提前一,然后打开下一个文件。它应该在尝试打开一个不存在的文件之前退出。
该函数正常工作,直到到达最后一个文件,此时抛出调试断言。
void next_file ( int & n , int argc , char *argv [] , fstream & file )
{
n++;
if ( n > argc )
exit ( 0 );
file_handler ( file , argv [n - 1] , 0);
file_handler ( file , argv [n] , 1 ); //this appears to be the cause of the assertion failure
}
void file_handler ( fstream & file , string name , bool open )
{
if ( open == 0 )
{
file.close ();
file.clear ();
return;
}
in.open ( name , ios::in | ios::out | ios::binary );
if ( !in.is_open () )
{
cout << "\n Failed opening " << name << "\n\n";
exit (0);
}
}
答案 0 :(得分:1)
你跑掉阵列的末尾。
如您所知,当数组包含n
个元素时,它们的值为array[0]
到array[n-1]
。
n++;
if ( n > argc )
exit ( 0 );
此时,n
的最高可能值为argc
,因为如果n > argc
,exit(0)
被调用。但是当n
等于argc
时,这将继续。因此:
file_handler ( file , argv [n] , 1 ); //this appears to be the cause of the assertion failure
当然这将是断言的原因。如上所述,此处n
的最高值为argc
。
当然,argv[argc]
不存在。 argc
中有argv
个值,因此最后一个值为argv[argc-1]
。
实际上,设置argv
main()
参数的方式,argv[argc]
将返回nullptr
。 file_handler()
的此参数为std::string
,尝试从std::string
构建nullptr
将提升您的断言。
答案 1 :(得分:0)
对于main
参数,argv[argc]
的值保证为0.
然后,使用n
== argc
,
file_handler ( file , argv [n] , 1 )
......相当于
file_handler ( file , 0 , 1 )
...其中0用于初始化std::string
正式参数,这是非常不合适的。