feof()与strtok()退出循环体的注意事项
2011-05-15 12:26
204 查看
今天在进行单步调试时才发现,原来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,退出循环。
比如有这个一个文件a.txt
basketball the nba
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,退出循环。
相关文章推荐
- 入手Docker容器注意事项:命令结束容器退出
- 函数feof使用注意事项
- feof()函数注意事项
- C标准库函数strtok使用注意事项
- shell中使用vi退出的注意事项
- 使用swipebacklayout实现ios右滑退出效果及注意事项
- strtok()函数的使用以及注意事项
- strtok使用注意事项
- cas单点退出,登陆,跨域获取信息,及切换特性注意事项
- Hql语句注意事项总结
- asp.net Server.MapPath方法注意事项
- CE6添加Armulator SDK注意事项
- 【android】使用CursorAdapter注意事项
- Wireshark使用注意事项
- 结构体构造器注意事项
- Linux 下执行*.run文件时注意事项
- Torch+DeepSpeech2的语音识别注意事项
- javascript removeChild 使用注意事项
- 关于spring实例化action的注意事项
- 枚举需要的注意事项