fgets 函数得问题

smsmsm 2002-11-07 12:45:06
# include<stdio.h>
# include<string.h>

# define MAX_SIZE 200

int main()
{
char buffer[ MAX_SIZE ];
int i = 0;

FILE *in;

in = fopen("temp.c","r");
if( !in ){
fprintf(stderr, "Open file %s failed!\n","temp.c");
exit( -1);
}

memset( buffer, '\0', sizeof( buffer ) );
while( !feof( in ) ){
(void *)fgets( buffer, MAX_SIZE, in );
#ifdef TEST1
for(; i < sizeof( buffer ); i ++)
printf("%c",buffer[ i ] );
#endif

#ifdef TEST2
printf("%s",buffer);
#endif

}
# ifdef TEST3
while( fgets( buffer, MAX_SIZE, in ) != NULL )
printf("%s",buffer );
# endif
printf("%d",strlen(buffer));

fclose( in );
exit( 0 );
}
==========================================
/* temp.c:
hello world! This is Linux World!
*/
==========================================
上面是fgets 得测试代码和 temp.c文件得内容
其中 temp.c 得内容小于 MAX_SIZE 并且是一行写完得

我得问题是 :
测试 TEST2 时:
会得到两行输出
而测试其他得都是一行输出??

thanks!


...全文
578 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyingdiablo 2002-11-07
  • 打赏
  • 举报
回复
出现两行的原因在于下面的 i < sizeof( buffer )
因为sizeof( buffer)永远等于 MAX_SIZE 200 所以回打印两行
如果改成 i<strlen(buffer)就OK了
#ifdef TEST1
for(; i < sizeof( buffer ); i ++)
printf("%c",buffer[ i ] );
#endif
jfguo 2002-11-07
  • 打赏
  • 举报
回复
程序逻辑有问题,TEST1时不输出两行是由于for(; i < sizeof( buffer ); i ++)中i没赋初值,假如写为for(i=0; i < sizeof( buffer ); i ++)也会输出两行的,就是说while()一定会循环两次. feof()是先读然后再判断的,所以改为下面这样就不会有问题了

(void *)fgets( buffer, MAX_SIZE, in );

while( !feof( in ) ){
#ifdef TEST1
for(; i < sizeof( buffer ); i ++)
printf("%c",buffer[ i ] );
#endif

#ifdef TEST2
printf("%s",buffer);
#endif
(void *)fgets( buffer, MAX_SIZE, in );

}


Hiei1234 2002-11-07
  • 打赏
  • 举报
回复
回答:
你的程序的问题不是在TEST2上,TEST2并没有错,而是你的temp.c有问题
或者是操作系统系统的错误引起的

我的机器配置PIII700,128内存,操作系统 win2000,使用M VC++6.0企业版
和turboC 2.0

我第一次调试过程是:先重网上用复制粘贴写成.c的两份文件
我将程序原文件命名为test.c测试文件为temp.c
我按你的条件改动程序在VC和TC上都进行过调试得出的TEST1和TEST2与你的结果一样
TEST3没有输出。

经过一段时间的对TEST2修改和调试并没有进展从我编程的经验我决定重写temp.c。
接着我重新调试,得出TEST2没有错误,而TEST3仍没有输出。
我再用TC调试也一样,接着我重启计算机仍是TEST2没错所以我断定TEST2没有
错误

但你写的程序却有错误存在:
1、要使用exit()函数要加#include<stdlib.h>,否则会有一个警告
2、这是一个逻辑错误你的
while( !feof( in ) )
{
(void *)fgets( buffer, MAX_SIZE, in );
我想你是想让fgets()函数为TEST1和TEST2服务
但是你并没将这个while条件设成条件编译这样
由于fgets()函数碰到'\n'或EOF或缓冲区已满就会返回,所以当你执行完语句后文件指针就会指在下一行的开头
而你的TEST3里的这句
while( fgets( buffer, MAX_SIZE, in ) != NULL )
printf("%s",buffer );
因为前面不管define的是TEST1、TEST2、TEST3都要执行
while语句
所以当你define TEST3时 程序执行到# ifdef TEST3时文件指针已指在EOF
所以没有输出

还有这句printf("%d",strlen(buffer));
在define TEST3是它却是对的
这是由于temp.c只有一行的原因
因为strlen()函数只有碰到'\0'才会返回
由于第二行是EOF符号所以执行fgets()函数后只有buffer[1]被改成了
EOF的符号其余都没有变








69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧