缓冲区的相关理解以及概念、

模拟C语言库的缓冲区和文件相关封装的实现:
Mystdio.c文件:
cpp
#define FILE_MODE 0666
_FILE* _fopen(const char *filename, const char *flag)
{
assert(filename);
assert(flag);
int mode = 0;
size_t fd = -1;
//判断打开方式,模拟w、a、r
if(strcmp(flag,"w") == 0)
{
//设置文件权限
mode = (O_CREAT|O_WRONLY|O_TRUNC);
//打开文件
fd = open(filename,mode,FILE_MODE);
}
else if(strcmp(flag,"a") == 0)
{
mode = (O_CREAT|O_WRONLY|O_APPEND);
fd = open(filename,mode,FILE_MODE);
}
else if(strcmp(flag,"r") == 0)
{
mode = O_RDONLY;
fd = open(filename,mode);
}
else
{
return NULL;
}
//有可能文件都没打开
if(fd == -1)
{
return NULL;
}
//把fd放到_FILE结构体对象中
_FILE* fp = (_FILE*)malloc(sizeof(_FILE));
if(fp == NULL)
{
perror("malloc fail");
return NULL;
}
fp->fileno = fd;
fp->flag = FLUSH_LINE;//行刷新
fp->out_pos = 0;
return fp;
}
int _fwrite(_FILE *fp, const char *s, int len)
{
//将s拷贝到缓冲区中
memcpy(&fp->outbuffer[fp->out_pos],s,len);
fp->out_pos += len;
//判断刷新方式
if(fp->flag & FLUSH_NOW)
{
//立即刷新
write(fp->fileno,fp->outbuffer,fp->out_pos);
fp->out_pos = 0;
}
else if(fp->flag & FLUSH_LINE)
{
//行刷新
if(fp->outbuffer[fp->out_pos] == '\n')
{
write(fp->fileno,fp->outbuffer,fp->out_pos);
fp->out_pos = 0;
}
else
{
return len;
}
}
else if(fp->flag & FLUSH_ALL)
{
//全缓冲
if(fp->out_pos == SIZE)
{
write(fp->fileno,fp->outbuffer,fp->out_pos);
fp->out_pos = 0;
}
else
{
return len;
}
}
}
void _fflush(_FILE *fp)
{
if(fp->out_pos > 0)
{
write(fp->fileno,fp->outbuffer,fp->out_pos);
fp->out_pos = 0;
}
}
void _fclose(_FILE *fp)
{
if(fp == NULL)
{
return ;
}
_fflush(fp);
close(fp->fileno);
free(fp);
}
Mystdio.h文件:
cpp
#ifndef __MYSTDIO_H__
#define __MYSTDIO_H__
#include<string.h>
#define SIZE 1024
#define FLUSH_NOW 1
#define FLUSH_LINE 2
#define FLUSH_ALL 4
typedef struct IO_FILE
{
int fileno;//文件描述符
int in_pos;//缓冲区已经写了多少
char inbuffer[SIZE];//输入缓冲区
int out_pos;//缓冲区已经写了多少
char outbuffer[SIZE];//输出缓冲区
int flag;//刷新方式
}_FILE;
void _fflush(_FILE *fp);
_FILE* _fopen(const char *filename, const char *flag);
int _fwrite(_FILE *fp, const char *s, int len);
void _fclose(_FILE *fp);
#endif
测试main.c文件:
cpp
#include "Mystdio.h"
int main()
{
_FILE *fp = _fopen("test.txt","a");
if(fp == NULL)
{
return 1;
}
const char *message = "I miss you\n";
_fwrite(fp,message,strlen(message));
_fflush(fp);
_fclose(fp);
return 0;
}