実行時に、プログラムはコマンドラインから1つ以上の引数を取ります。各引数は、開くファイルの名前です。exit(0)の後にプログラムが実行され続けているように見える
argc ==ファイル名の数。
argv [0] ==プログラムの名前です。
ここでnは、コマンドラインから渡される順序に従って、与えられたファイル名の整数です。
next_file編集する次のファイルに進みます。 nをインクリメントし、nがargcより大きい場合は終了します。これは、最後のファイルにすでに到達していることを意味するからです。それ以外の場合は、file_handlerを呼び出します。
file_handlerは、ストリームオブジェクト[file]、文字列[name]、ブール変数[open]をとります。 openが0の場合、現在のファイルを閉じます。 openが1の場合、[file]で[name]を開きます。
next_fileが呼び出されると、現在開いているファイルを閉じ、[n]を1つ進めて次のファイルを開くことが期待されます。存在しないファイルを開く前に終了する必要があります。
最後のファイルに達するまで関数は正常に動作し、その時点でデバッグアサーションがスローされます。
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);
}
}
'exit(0)'を含むステートメントの場合、どのように実行されたと思いますか?デバッガを踏んだ? – amanuel2
はい、私はそれを含めるのを忘れました、問題の行のコメントに編集しました。 – srcs
'int'フラグの代わりに' bool'型を使わないのはなぜですか?またはさらに適切な列挙体。 –