coding第11天1.4

fopen函数

#include <fcntl.h>
#include <unistd>

#define PERMS 0666

FILE *fopen(char *name,char *mode)
{
	int fd;
	FILE *fp;

	if(*mode!='r'&&*mode!='w'&&*mode!='a')
	{
		return NULL;
	}
	for(fp=_iob;fp<_iob+OPEN_MAX;fp++)
	{
		if((fp->flag&(_READ|_WRITE))==0)
		{
			break;
		}
		if(fp>=_iob+PEEN_MAX)
		{
			return NULL;
		}
		if(*mode=='w')
		{
			fd=creat(name,PERMS);
		}
		else if(*mode=='a')
		{
			if((fd=open(name,O_WRONLY,0))==-1)
			{
				fd=creat(name,PERMS);
			}
			Iseek(fd,0L,2);
		}
		else
		{
			fd=open(name,O_RDONLY,0)
		}
		if(fd=-1)
		{
			return NULL;
		}
		fp->fd=fd;
		fp->cnt=0;
		fp->base=NULL:
		fp->flag=(*mode=='r')?_READ:_WRITE;
		return fp;
	}
}

_fillbuf函数

_fillbuf函数
如果文件不是以读方式打开,则立刻返回EOF,否则试图分配一个缓冲区,建立缓冲区后,_fillbuf调用read填充此缓冲区,设置计数值和指针,并返回缓冲区的第一个字符。随后进行的_fillbuf调用会发现缓冲区已经分配。

#include <unistd>

int _fillbuf(FILE *fp)
{
	int bufsize;

	if((fp->flag(_READ|_EOF|_ERR))!=_READ)
	{
		return EOF;
	}
	bufsize=(fp->flag&_UNBUF)?1:BUFSIZ;
	if((fp->base==NULL))
	{
		if((fp->base=(char *)malloc(bufsize))==NULL)
		{
			return EOF;
		}
	}
	fp->ptr=fp->base;
	fp->cnt=read(fp->fd,fp->ptr,bufsize);
	if(--fp->cnt<0)
	{
		if(fp->cnt==-1)
		{
			fp->flag|=_EOF;
		}
		else
		{
			fp->flag|=_ERR;
		}
		fp->cnt=0;
		return EOF;	
	}
	return (unsigned char)*fp->ptr++;
}

初始化数组_iob;

FILE _iob[OPEN_MAX]=
{
	0,(char *)0,(char *)0,_READ,0,
	0,(char *)0,(char *)0,_WRITE,1,
	0,(char *)0,(char *)0,_WRITE|_UNBUF,2
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来根华子冷静下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值