1. ホーム
  2. c

[解決済み] アサーションに失敗するのはなぜですか?

2022-02-27 13:21:34

質問

このコードをVC2010でデバッグしようとすると失敗します。

char frd[32]="word-list.txt";

FILE *rd=fopen(frd,"r");
if(rd==NULL)
{
std::cout<<"Coudn't open file\t"<<frd;
exit(1);
}
char readLine[100]; 
while(fgets(readLine, 100, rd) != NULL)
{     
    readLine[strlen(readLine) - 1] = '\0'; 
    char *token = NULL; 
    token = strtok(readLine, " ,"); 
    insert(readLine);
} 

デバッグの結果

--------------------------- Microsoft Visual C++ デバッグライブラリ------------。

デバッグアサーションに失敗しました

Program: ...\documentsvisual studio 2010Projects﹑bfaDebug﹑bfa.exe File: f:\ddvctools\crt_bld_self_x86crt_srcfgets.c Line: 57

式になります。( str != NULL )

プログラムがどのようにアサーション失敗を引き起こすかについての情報は、こちらをご覧ください。 は、Visual C++のアサートに関するドキュメントを参照してください。

(アプリケーションをデバッグするにはRetryを押してください)

--------------------------- Abort Retry Ignore

errnoは2です。

どうすればいいですか?

私の推測では、ファイルを開くのに失敗し、それをまだfgetsに渡しているのだと思います。 if(rd==NULL)は、NULLの場合、fgetsの実行を停止せず、メッセージを出力して実行を継続するのです。

非常に基本的なエラー処理です。

const char* frd = "word-list.txt";

FILE *rd=fopen(frd,"r");
if(rd==NULL) {
    std::cout<<"Coudn't open file"<<endl;
    return 1;
}

char readLine[100]; 
while(fgets(readLine, 100, rd) != NULL)
{     
    readLine[strlen(readLine) - 1] = '\0'; 
    char *token = NULL; 
    token = strtok(readLine, " ,"); 
    insert(readLine);
}