基础IO -- 简单封装库(文件操作)
1.mystdio.c (函数实现)
#include "mystdio.h"myFILE* my_fopen(const char *path, const char *flag)
{int flag1 = 0;int iscreate = 0;mode_t mode = 0666;if(strcmp(flag, "r") == 0){flag1 = (O_RDONLY);}else if(strcmp(flag, "w") == 0){flag1 = (O_WRONLY | O_CREAT | O_TRUNC);iscreate = 1;}else if(strcmp(flag, "a") == 0){flag1 = (O_WRONLY | O_CREAT | O_APPEND);iscreate = 1;}else{}int fd = 0;if(iscreate)fd = open(path, flag1, mode);elsefd = open(path, flag1);if(fd < 0) return NULL;myFILE *fp = (myFILE*)malloc(sizeof(myFILE));if(!fp) return NULL;fp->fileno = fd;fp->flags = FLUSH_LINE;fp->cap = LINE_SIZE;fp->pos = 0;return fp;
}void my_fflush(myFILE *fp)
{write(fp->fileno, fp->cache, fp->pos);fp->pos = 0;
}ssize_t my_fwrite(myFILE *fp, const char *data, int len)
{// 写入操作本质是拷贝, 如果条件允许,就刷新,否则不做刷新memcpy(fp->cache+fp->pos, data, len); //肯定要考虑越界, 自动扩容 这里简易版,不做处理fp->pos += len;if((fp->flags&FLUSH_LINE) && fp->cache[fp->pos-1] == '\n'){my_fflush(fp);}return len;
}void my_fclose(myFILE *fp)
{my_fflush(fp);close(fp->fileno);free(fp);
}
2.mystdio.h (函数声明)
#pragma once#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define LINE_SIZE 1024
#define FLUSH_NOW 1
#define FLUSH_LINE 2
#define FLUSH_FULL 4struct _myFILE
{unsigned int flags;int fileno;// 缓冲区char cache[LINE_SIZE];int cap;int pos; // 下次写入的位置
};typedef struct _myFILE myFILE;myFILE* my_fopen(const char *path, const char *flag);
void my_fflush(myFILE *fp);
ssize_t my_fwrite(myFILE *fp, const char *data, int len);
void my_fclose(myFILE *fp);
3.testfile.c (测试)
#include "mystdio.h"
#include <string.h>
#include <stdio.h>
#include <unistd.h>#define FILE_NAME "log.txt"int main()
{myFILE *fp = my_fopen(FILE_NAME, "w");if(fp == NULL) return 1;const char *str = "hello bit";int cnt = 10;char buffer[128];while(cnt){sprintf(buffer, "%s - %d\n", str, cnt);my_fwrite(fp, buffer, strlen(buffer)); // strlen()+1不需要cnt--;sleep(1);}my_fclose(fp);return 0;
}
测试为利用模拟的fopen、fwrite、fflush以及fclose去实现向log.txt文件中每隔一秒写入1行字符串,共十秒