目录
1.FILE封装
C语言的输入接口,都会向FILE*stdin里面的缓冲区打印。
首先我们要封装的就是FILE结构体
这个结构体大概含有以下内容
1.一个C语言的缓冲区buffer
2.一个文件描述符fileno
3.当前缓冲区的大小
4.缓冲区的容量
5.刷新的策略,不同文件的刷新策略不同,显示器文件为行刷新,普通文件为全刷新。
#include<stdio.h>
2 #define SIZE 1024
3 #define NONEFLUSH 1<<1//无刷新
4 #define LINEFLUSH 1<<2//行刷新
5 #define FULLFLUSH 1<<3//全刷新
6
7 typedef struct _myFILE
8 {
9 char buffer[SIZE];
10 int pos;
11 int cap;
12 int fileno;
13 int flushmode;
14 }myFILE;
2.fopen的实现
fopen是对open的封装
主要就是根据打开方式,打开文件,创建一个myFILE,返回个myFILE*即可。
myFILE * myfopen(const char* path,const char*mode)
{
int flag = 0;
if(strcmp(mode,"r") == 0)
{
flag |= O_RDONLY;
}
else if(strcmp(mode,"w") == 0)
{
flag |= (O_TRUNC|O_WRONLY|O_CREAT);
}
else if(strcmp(mode,"a"))
{
flag |= (O_WRONLY|O_APPEND|O_CREAT);
}
else
{
printf("bad mode");
return NULL;
}
int fd = 0;
if(flag & O_WRONLY)
{
umask(0);
fd = open(path,flag,0666);
}
else
{
fd = open(path,flag);
}
if(fd < 0)
{
printf("open fail");
return NULL;
}
myFILE *fp = (myFILE*)malloc(sizeof(myFILE));
if(fp == NULL)
{
printf("malloc fail");
return NULL;
}
fp->fileno = fd;
fp->flushmode = LINEFLUSH;
return fp;
}
2.fflush的实现
fflush把当缓冲区的内容,清空,拷贝到系统的缓冲区。
int myfflush(myFILE * fp)
{
if(fp->pos == 0)
return 0;
write(fp->fileno,fp->buffer,fp->pos);
fp->pos = 0;
return 0;
}
3.fwrite的实现
向c语言缓冲区写入,再根据刷新策略,刷新到系统缓冲区。
int myfwrite(myFILE *fp,char *s ,size_t n)
{
//向缓冲区写入
strncpy(fp->buffer+fp->pos,s,n);
fp->pos += n;
if((fp->flushmode & LINEFLUSH) && fp->buffer[fp->pos-1] =='\n')//行刷新
{
myfflush(fp);
}
else if((fp->flushmode & FULLFLUSH) && fp->pos == fp->cap)//全刷新
{
myfflush(fp);
}
else
{
return 0;
}
return n;
}
4.fclose的实现
void myfclose(myFILE * fp)
{
myfflush(fp);
close(fp->fileno);
free(fp);
}