@toc 模仿c庫,封裝一個(gè)簡化的文件接口 file
- 創(chuàng)建Makefile—
創(chuàng)建Makefile
testfile: main.c mystdio.c gcc -o $@ $^ .PHONY:clean clean: rm -f testfile
- mystdio.h ——接口的聲明,創(chuàng)建MY_FILE結(jié)構(gòu)體,內(nèi)部包含文件描述符fd,輸出緩沖區(qū)outputbuffer、flags刷新方法
—
通過C庫中fopen、fwrite、fclose接口的實(shí)現(xiàn),設(shè)計(jì)自己的接口
—
—
—
3. mystdio.c —— 接口的實(shí)現(xiàn)1. MY_fopen的實(shí)現(xiàn)1.識別標(biāo)志位
實(shí)現(xiàn)了讀、寫、追加方式
- 嘗試打開文件若想打開文件,需要調(diào)用open函數(shù)
—
—
若需要創(chuàng)建文件,則需調(diào)用第二個(gè)open函數(shù)。由于open中的mode參數(shù)受umask影響,所以設(shè)置一個(gè)默認(rèn)的mode。若不需要創(chuàng)建文件,則調(diào)用第一個(gè)open函數(shù)。
4.初始化MY_FILE對象 將結(jié)構(gòu)體MY_FILE內(nèi)部的fd賦值為open函數(shù)打開的返回值fd。刷新方法設(shè)置成行緩沖,outputbuffer緩沖區(qū)中全部初始化為0,current代表緩沖區(qū)中沒有數(shù)據(jù)。
5.返回打開的文件當(dāng)關(guān)閉文件的時(shí)候,fclose(FILE*)將c語言當(dāng)中的文件指針傳進(jìn)來。當(dāng)關(guān)閉文件的時(shí)候,C要自己幫助我們進(jìn)行沖刷緩沖區(qū)。為了方便表述,在MY_FILE結(jié)構(gòu)體添加current變量。
current代表下次寫入時(shí)應(yīng)該寫入的位置,如outputbuffer中有5個(gè)字符,對應(yīng)下標(biāo)0 1 2 3 4,所以current代表下標(biāo)5。
2.MY_close 的實(shí)現(xiàn)沖刷緩沖區(qū)自己實(shí)現(xiàn)一個(gè)fflush(刷新緩沖區(qū)),叫做MY_fflush
—
判斷緩沖區(qū)是否有數(shù)據(jù),若有數(shù)據(jù)就刷新出去。
3. MY_fwrite的實(shí)現(xiàn)
緩沖區(qū)為ptr,單個(gè)單元的大小為size,nmemb代表想要寫入幾個(gè)單元,寫入對應(yīng)的流中。實(shí)際上是往緩沖區(qū)里寫的。
1.緩沖區(qū)如果已經(jīng)滿了,就直接寫入流中刷新流的緩沖區(qū)。
2.根據(jù)緩沖區(qū)剩余情況,進(jìn)行拷貝 共分為兩種情況,若剩余空間足夠,則調(diào)用if語句,將用戶從ptr拷貝的數(shù)據(jù)全部拷貝給緩沖區(qū),同時(shí)由于緩沖區(qū)加入user_size個(gè)字節(jié),要更新current的位置。若剩余空間不足夠,則調(diào)用else語句,將從ptr拷貝的數(shù)據(jù)填滿剩余空間即可,同時(shí)由于緩沖區(qū)加入MY_size個(gè)字節(jié),要更新current的位置。
通過調(diào)用writen代表實(shí)際寫了多少字節(jié),為了充當(dāng)最后的返回值。
- 開始計(jì)劃刷新
主要分為全刷新和行刷新兩種情況,其他不考慮。全刷新判斷緩沖區(qū)是否滿了,若滿了則直接刷新緩沖區(qū)。行刷新判斷是否遇見n,若遇見n則直接刷新緩沖區(qū)。
對之前內(nèi)容清空為了防止出現(xiàn)每次打印都會有之前的內(nèi)容情況,所以刷新之后要清空。
在這種情況下,之前的內(nèi)容會被打印出來。
將current置為0后,下次寫入就可以覆蓋上次緩沖區(qū)內(nèi)容。
- 整體代碼1. main.c
#include"mystdio.h" #include<string.h> #include<unistd.h> #define MYFILE "log.txt" int main() { MY_FILE*fp=MY_fopen(MYFILE,"w"); if(fp==NULL) return 1; const char*str="hello world"; int cnt=5; //操作文件 while(1) { char buffer[1024]; snprintf(buffer,sizeof(buffer),"%s:%dn",str,cnt--); size_t size=MY_fwrite(buffer,strlen(buffer),1,fp); sleep(1); printf("當(dāng)前成功寫入:%lu個(gè)字節(jié)n",size); } MY_fclose(fp); return 0; }
- mystdio.h
#include<stdio.h> #define NUM 1024 #define BUFF_NONE 0x1 //表示無緩沖 #define BUFF_LINE 0x2 //行緩沖 #define BUFF_ALL 0x4 //全緩沖 typedef struct MY_FILE { int fd;//文件描述符 int flags;//刷新方法 char outputbuffer[1024];//輸出緩沖區(qū) int current; }MY_FILE; MY_FILE *MY_fopen(const char *path, const char *mode);//自己寫fopen size_t MY_fwrite(const void *ptr, size_t size, size_t nmemb, MY_FILE *stream);//自己寫的fwrite int MY_fclose(MY_FILE *fp);//自己寫的fwrite int MY_fflush (MY_FILE*fp);//自己實(shí)現(xiàn)的緩沖區(qū)
- mystdio.c
#include"mystdio.h" #include<string.h> #include<sys> #include<sys> #include<fcntl.h> #include<stdlib.h> #include<unistd.h> #include<assert.h> MY_FILE*MY_fopen(const char *path, const char *mode)//自己寫fopen { int flag=0; if(strcmp(mode,"r")==0)//說明當(dāng)前使用讀方式打開文件 flag |= O_RDONLY;//讀取 else if(strcmp(mode,"w")==0) flag |=(O_CREAT | O_WRONLY | O_TRUNC);//創(chuàng)建文件 以寫的方式打開文件 清空文件 else if(strcmp(mode,"a")==0) flag |=(O_CREAT | O_WRONLY | O_APPEND); //創(chuàng)建文件 以寫的方式打開文件 追加 else { //其他不考慮 } //2. 嘗試打開文件 mode_t m=0666; int fd=0; //flag代表模式 r w a if(flag & O_CREAT) fd=open(path,flag,m); else //說明不需要打開 fd=open(path,flag); if(fd<0) return NULL; //3. 給用戶返回MY_FILE對象,需要先創(chuàng)建對象 MY_FILE *mf = (MY_FILE*)malloc(sizeof(MY_FILE)); if(mf == NULL) { close(fd); return NULL; } //4. 初始化MY_FILE對象 mf->fd=fd;//將上述的fd傳入結(jié)構(gòu)體的fd中 mf->flags=0; mf->flags=BUFF_LINE;//設(shè)置成行緩沖 memset(mf->outputbuffer,' 主站蜘蛛池模板: 欧美日韩国产亚洲一区二区 | 在线国产视频 | 欧美日韩免费在线观看 | 一本久道久久综合中文字幕 | 亚洲国产成人资源在线桃色 | 亚洲欧美影视 | 宅男视频在线观看免费高清完整 | 亚洲视频在线视频 | 亚洲高清美女一区二区三区 | 亚洲男人的天堂久久精品 | 中文国产成人精品久久水 | 亚洲人成一区二区三区 | 欧美综合图片一区二区三区 | www亚洲欲色成人久久精品 | 全国男人的天堂网 | 插寡妇| 一级网站在线观看 | 最新高清无码专区 | 羞羞免费观看网站 | 一区二区三区免费在线 | 亚洲欧美自拍视频 | 亚洲精品免费在线观看 | 黄色毛片视频 | 久久成人国产精品二三区 | 亚洲国产天堂久久综合9999 | 一级片在线免费 | 激情阁| 真实国产网爆门事件在线观看 | 在线美女免费观看网站h | 国产无限制自拍 | 亚洲一级影院 | 自拍偷拍免费 | 五月天婷婷缴情五月免费观看 | 最新qvod电影 | 全免费a级毛片免费看视频免 | 亚洲性久久久影院 | 久久久久免费精品国产 | 五月婷婷丁香网 | 五月婷婷在线观看视频 | 亚洲欧美一区二区三区不卡 | 亚洲国产精品视频 |