今天在进行单步调试时才发现,原来feof是在读取完文件内容之后的下一次读取时才能发现文件已经终止,以前一直以为是读取完文件内容后就遇到了文件结束符EOF,自然终止了。
比如有这个一个文件a.txt
while((t=feof(fp)) == 0)
{
fgets(line,1024,fp);
……
}
注:fp是打开的文件指针,t是int,line是一个长度1024的char数组
第一次循环,t==0,读取完一行时,已经把文件内容全部读取,执行完循环体,再次判断循环条件时,t依然会等于0,继续执行循环体,回来再次判断循环条件,这时t才等于1,才退出循环。
如果没注意到这一点而循环体里面有对读取内容的某些操作很可能会产生段错误。
比如在fgets(line,1024,fp);后面有下面语句的话
p = strchr(line,(int)'/n');
*p = '/0';
这里是想去掉读取到的一行中的‘/n'。第二次执行循环体时因为实际上没有读取到新的一行,p会是NULL,而对p赋值就会产生了对内存的非法操作,段错误。
========================
strtok在截取完全部字符串后并没有马上退出循环,也是再多执行了一次循环体后才能发现读取完了
word = strtok(line," ");
while(word != NULL)
{
word = strtok(NULL," ");//get a word of the line
printf("word:%s/n",word);
}
执行结果是:(line中已经去掉'/n')
basketball
the
nba
(null)
在读出"nba"后,word不为NULL,继续执行循环体,之后word才会等于NULL,退出循环。