日韩天堂,国产精品久久久久久久久久一区,羞羞羞网站,自拍视频网站,久久亚洲欧美成人精品,桃花阁成人网在线观看

Hello! 歡迎來到小浪云!


【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE


avatar
小浪云 2025-04-19 83

@toc 模仿c庫,封裝一個(gè)簡化的文件接口 file

  1. 創(chuàng)建Makefile—

創(chuàng)建Makefile

testfile: main.c mystdio.c     gcc -o $@ $^ .PHONY:clean clean:     rm -f testfile
  1. mystdio.h ——接口的聲明,創(chuàng)建MY_FILE結(jié)構(gòu)體,內(nèi)部包含文件描述符fd,輸出緩沖區(qū)outputbuffer、flags刷新方法

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE

通過C庫中fopen、fwrite、fclose接口的實(shí)現(xiàn),設(shè)計(jì)自己的接口

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE3. mystdio.c —— 接口的實(shí)現(xiàn)1. MY_fopen的實(shí)現(xiàn)1.識別標(biāo)志位【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE 實(shí)現(xiàn)了讀、寫、追加方式

  1. 嘗試打開文件若想打開文件,需要調(diào)用open函數(shù)

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE

若需要創(chuàng)建文件,則需調(diào)用第二個(gè)open函數(shù)。由于open中的mode參數(shù)受umask影響,所以設(shè)置一個(gè)默認(rèn)的mode。若不需要創(chuàng)建文件,則調(diào)用第一個(gè)open函數(shù)。

  1. 給用戶返回MY_FILE對象,需要先創(chuàng)建對象【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE判斷對象是否創(chuàng)建成功,若失敗需要將文件關(guān)閉。

4.初始化MY_FILE對象【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口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變量。

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILEcurrent代表下次寫入時(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

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE判斷緩沖區(qū)是否有數(shù)據(jù),若有數(shù)據(jù)就刷新出去。


【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE3. MY_fwrite的實(shí)現(xiàn)【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE緩沖區(qū)為ptr,單個(gè)單元的大小為size,nmemb代表想要寫入幾個(gè)單元,寫入對應(yīng)的流中。實(shí)際上是往緩沖區(qū)里寫的。

1.緩沖區(qū)如果已經(jīng)滿了,就直接寫入流中【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE刷新流的緩沖區(qū)。

2.根據(jù)緩沖區(qū)剩余情況,進(jìn)行拷貝【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE 共分為兩種情況,若剩余空間足夠,則調(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)最后的返回值。

  1. 開始計(jì)劃刷新【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE主要分為全刷新和行刷新兩種情況,其他不考慮。全刷新判斷緩沖區(qū)是否滿了,若滿了則直接刷新緩沖區(qū)。行刷新判斷是否遇見n,若遇見n則直接刷新緩沖區(qū)。

對之前內(nèi)容清空為了防止出現(xiàn)每次打印都會有之前的內(nèi)容情況,所以刷新之后要清空。

【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE在這種情況下,之前的內(nèi)容會被打印出來。


【Linux】 基礎(chǔ)IO——自己實(shí)現(xiàn)文件接口FILE 將current置為0后,下次寫入就可以覆蓋上次緩沖區(qū)內(nèi)容。

  1. 整體代碼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; }
  1. 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ū)
  1. 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级毛片免费看视频免
|
亚洲性久久久影院
|
久久久久免费精品国产
|
五月婷婷丁香网
|
五月婷婷在线观看视频
|
亚洲欧美一区二区三区不卡
|
亚洲国产精品视频
|