LINUX系统编程:stdin的实现

本文详细介绍了C语言中FILE结构体的封装,包括fopen函数根据打开模式创建myFILE,fflush清空并刷新缓冲区,fwrite向缓冲区写入并根据刷新策略操作,以及fclose关闭文件并释放资源的过程。
摘要由CSDN通过智能技术生成

目录

1.FILE封装

2.fopen的实现

2.fflush的实现

3.fwrite的实现

 4.fclose的实现

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);
 }

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值