关于EOF和系统调用lseek,read,write简单c程序,该如何解决

关于EOF和系统调用lseek,read,write简单c程序
以下有两个程序,作用是测文件字节数。
在红帽9.0下测试,第一个程序没问题,第二个程序,死循环。
问题是两个程序都是用的EOF作为判定文件结束的标志,为什么第一个程序能读到EOF就停止了,而第二个程序确似乎读不到,陷入死循环。
新手分数不多,但请大家不吝赐教,谢谢!!
[code=C/C++][/code]
#include <stdio.h>
int main(int argc,char *argv[])
{
int i=0;
FILE *fp;
char ch;
fp=fopen(argv[1],"r");
while((ch=fgetc(fp))!=EOF)
i++;
printf("%dBytes\n",i);
return 0;
}



#include <stdio.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd,i;
char buf[1];
char ch;
if(argc!=2)
{
printf("arguments error\n");
exit(1);
}
if((fd=open(argv[1],O_RDONLY))==-1)
{
printf("open error,or file is not exist\n");
exit(2);
}
for(i=0;ch!=EOF;i++)
{
lseek(fd,i,SEEK_SET);
read(fd,buf,1);
ch=buf[0];
}
close(fd);
printf("%d\n",i);
return 0;

}

------解决方案--------------------
read(fd,buf,1);
考虑下遇到EOF会把EOF读入buf吗?
------解决方案--------------------
EOF应该是read(fd,buf,1);的返回值
------解决方案--------------------
for(i=0;ch!=EOF;i++)
{
lseek(fd,i,SEEK_SET);
read(fd,buf,1);
ch=buf[0];
}

是不是每次自增的是int型的i;而你用char行的ch接受所以接受不到EOF啊
------解决方案--------------------
探讨
read(fd,buf,1);
考虑下遇到EOF会把EOF读入buf吗?

------解决方案--------------------
另外,正如我上面所说.如果是二制文件,数据是-1的话,你的第一个程序也有问题
Function: int fgetc (FILE *stream)
fgetc的返回应该是int而非char,这样当fgetc读到-1时(0xff),实际的返回值就是255而非-1,只有当文件结尾时,才返回-1的

------解决方案--------------------
探讨
引用:
read(fd,buf,1);
考虑下遇到EOF会把EOF读入buf吗?

++
read不会读入EOF的
还有个问题,如果数据正好是-1的话,程序到是会退出的

------解决方案--------------------
探讨
引用:
引用:
read(fd,buf,1);
考虑下遇到EOF会把EOF读入buf吗?

++
read不会读入EOF的
还有个问题,如果数据正好是-1的话,程序到是会退出的



read是不是读二进制文件的,对其他文件好像不感冒
我在vs下用getc好像可以停止