免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2230 | 回复: 5
打印 上一主题 下一主题

[C] 为何下列C程序在AIX下会陷入死循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-27 10:47 |只看该作者 |倒序浏览
#include<stdio.h>

int main(int argc, char* argv[])
{
    char ch;
        FILE *fp;
            int i;
                char filepath[15];
                if((fp=fopen(argv[1], "r"))==NULL)
                {
                  do
                  {
                    printf("not file\n");
                      printf("please enter another file!\n");
                        scanf("%s",filepath);
                        }while((fp=fopen(filepath,"r"))==NULL);

                        }

                        while((ch=fgetc(fp))!=EOF)
                        putchar(ch);
                        fclose(fp);
                        return 0;
}

请大家看一下,是不是EOF没有啊

论坛徽章:
0
2 [报告]
发表于 2009-07-27 11:28 |只看该作者
fgetc的返回值是int吧。

int fgetc(FILE *stream);

EOF可能是一个int,但是赋给char,只取了最低的一个字节。

论坛徽章:
0
3 [报告]
发表于 2009-07-27 11:54 |只看该作者
EOF书上说是文件的结束符,我看教程也是这样判断文件结束的。
其实我就是想知道自己能够判断读取的一个文件是否结束

论坛徽章:
0
4 [报告]
发表于 2009-07-27 13:22 |只看该作者

回复 #3 ghostagan 的帖子

这个可能跟AIX的char和int的转换有关,跟我们一般理解的有出入。
fgetc返回的是一个int值,所以你最好还是把ch声明成int型吧,
EOF是一个宏定义,代表-1.
按理说将int的-1转换成char也是-1,然后在将char的-1转换成int还是-1,所以一般是不会死循环的,不过不知道AIX是怎么转换的,知道的同学给我们讲一下阿。

论坛徽章:
0
5 [报告]
发表于 2009-07-27 13:29 |只看该作者

回复 #4 progliker 的帖子

谢谢progliker,把ch定义成int类型就可以了,但是就如你说的,为什么多转换了几次就不能执行了呢?

论坛徽章:
0
6 [报告]
发表于 2009-07-28 10:07 |只看该作者
原帖由 progliker 于 2009-7-27 13:22 发表
这个可能跟AIX的char和int的转换有关,跟我们一般理解的有出入。
fgetc返回的是一个int值,所以你最好还是把ch声明成int型吧,
EOF是一个宏定义,代表-1.
按理说将int的-1转换成char也是-1,然后在将char的 ...


aix下xlc默认的编译char 就是unsigned char,可以用-qchar=signed来修正,具体可以参考xlc手册
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP