linux下用函数和系统调用分别实现计算文件长度(不解) 学习笔记

来源:互联网 发布:光信息科学与技术知乎 编辑:程序博客网 时间:2024/05/01 23:38

本文为在下学习当中遇到的一些问题,写下来作学习笔记。 平时没注意这些的朋友可以看看,懂的朋友请指点一二,谢谢!

用函数(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?

 

原创粉丝点击