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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值