本文为在下学习当中遇到的一些问题,写下来作学习笔记。 平时没注意这些的朋友可以看看,懂的朋友请指点一二,谢谢!
用函数(fgetc)和系统调用(lseek,read)分别实现计算文件长字节数,但是两者存在差别,源码如下:
mycount2.c
#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)
{
printf("i=%d\n",i); //测试时输出i的值,非必要
printf("ch=%c(%d)\n",ch,ch); //测试时输出c的值,非必要
i++;
}
printf("%dBytes\n",i);
return 0;
}
mycount.c
#include <stdio.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd,i=0;
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);
}
do
{
lseek(fd,i,SEEK_SET);
read(fd,buf,1);
ch=buf[0];
printf("i=%d\n",i); //测试时输出i的值,非必要
printf("ch=%c(%d)\n",ch,ch); //测试时输出c的值,非必要
i++;
}
while(ch!=EOF);
close(fd);
printf("total %d bytes\n",i);
return 0;
}
用以测试的文件file2内容如下:
程序一运行结果:
程序2运行部分结果:
可以看到,file2文件结束是以ascii码10(LF换行符)为标志的。
现在问题就出来了:
1、在file2中123后面换行到10,从程序输出结果i=7(也就是文件的第8个字符)的时候。但是同样是换行符,为什么i=7时的这个没有被系统作为文件结束的标志?
2、从程序2的输出可以看到,i=10的时候,已经到了文件末尾。但是程序2并没有正常退出,而是陷入死循环。两个程序同样都是判定EOF来作为结束的条件,为什么第一个程序能正常退出,而第二个却不能?
3、EOF在linux的值到底是多少?网上有说是-1,但是程序运行结果怎么没有看到-1.取而代之的却是LF?