为什么我断言失败?

Joh*_*ohn 2 c fgets assertion

当我尝试使用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);
} 
Run Code Online (Sandbox Code Playgroud)

调试结果

--------------------------- Microsoft Visual C++调试库-----------

调试断言失败!

程序:...\documents\visual studio 2010\Projects\bfa\Debug\bfa.exe文件:f:\ dd\vctools\crt_bld\self_x86\crt\src\fgets.c行:57

表达式:(str!= NULL)

有关程序如何导致断言失败的信息,请参阅有关断言的Visual C++文档.

(按"重试"调试应用程序)

---------------------------中止重试忽略

我得到的错误是2;

Cor*_*bin 5

我的猜测是文件无法打开,你仍然将它传递给fgets.if(rd == 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);
}
Run Code Online (Sandbox Code Playgroud)