2016-10-07 4 views
0

実行時に、プログラムはコマンドラインから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); 
    } 
} 
+0

'exit(0)'を含むステートメントの場合、どのように実行されたと思いますか?デバッガを踏んだ? – amanuel2

+0

はい、私はそれを含めるのを忘れました、問題の行のコメントに編集しました。 – srcs

+0

'int'フラグの代わりに' bool'型を使わないのはなぜですか?またはさらに適切な列挙体。 –

答えて

1

アレイの最後を使い果たしています。

ご存知のように、配列にnの要素がある場合、値はarray[0]array[n-1]です。この時点で

n++; 
if (n > argc) 
    exit (0); 

n > argc場合、exit(0)が呼び出されるので、nのための最高の可能な値は、argcです。しかし、nargcに等しい場合、これは進められます。したがって:

file_handler (file , argv [n] , 1); //this appears to be the cause of the assertion failure 

もちろんこれがアサーションの原因になります。上記で説明したように、nの最高値はargcになります。

もちろん、argv[argc]は存在しません。 の値がargvにあるため、最後の値はargv[argc-1]になります。

実際にへの引数がargvに設定されている場合、argv[argc]nullptrを返します。このパラメータをfile_handler()に設定すると、std::stringとなり、nullptrからstd::stringを作成しようとすると、アサートが発生します。

+0

質問にはすでに回答していました。 – srcs

0

main引数の場合、argv[argc]の値は0であることが保証されています。n == argc

file_handler (file , argv [n] , 1) 

&hellipとその後

、。

file_handler (file , 0 , 1) 

&hellipと同等です。ここで0は正式な引数であるstd::stringを初期化するために使用されます。

+0

質問にはすでに回答していました。 – srcs

関連する問題