简单设计MyFopen,MyFclose,MyFwrite,MyFFlush
mystdio.h
#pragma once
#include<stdio.h>
#define MAX 1024
#define NONE_FLUSH 1<<0
#define LINE_FLUSH 1<<1
#define FULL_FLUSH 1<<2
typedef struct IO_FILE
{
int fileno;
int flag;
char outbuffer[MAX];
int bufferlen;
int flush_method;
}MyFile;
MyFile* MyFopen(const char* path, const char* mode);
void MyFclose(MyFile*);
int MyFwrite(MyFile*, void* str, int len);
void MyFFlush(MyFile*);
mystdio.c
#include"mystdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
static MyFile* BuyFile(int fd, int flag)
{
MyFile* f = (MyFile*)malloc(sizeof(MyFile));
if (f == NULL) return NULL;
f->fileno = fd;
f->flag = flag;
f->bufferlen = 0;
f->flush_method = LINE_FLUSH;
memset(f->outbuffer, 0, sizeof(f->outbuffer));
return f;
};
MyFile* MyFopen(const char* path, const char* mode)
{
int fd = -1;
int flag = 0;
if (strcmp(mode, "w") == 0)
{
flag = O_CREAT | O_WRONLY | O_TRUNC;
fd = open(path, flag, 0666);
}
else if (strcmp(mode, "a") == 0)
{
flag = O_CREAT | O_WRONLY | O_APPEND;
fd = open(path, flag, 0666);
}
else if (strcmp(mode, "r") == 0)
{
flag = O_RDWR;
fd = open(path, flag);
}
else
{
}
if (fd < 0)return NULL;
return BuyFile(fd, flag);
}
void MyFclose(MyFile* file)
{
if (file->fileno < 0) return;
MyFFlush(file);
close(file->fileno);
free(file);
}
int MyFwrite(MyFile* file, void* str, int len)
{
memcpy(file->outbuffer + file->bufferlen, str, len);
file->bufferlen += len;
if (file->flush_method & LINE_FLUSH && file->outbuffer[file->bufferlen - 1] == '\n')
{
MyFFlush(file);
}
return 0;
}
void MyFFlush(MyFile* file)
{
if (file->bufferlen <= 0) return;
int n = write(file->fileno, file->outbuffer, file->bufferlen);
(void)n;
fsync(file->fileno);
file->bufferlen = 0;
}
usercode.c
#include "mystdio.h"
#include <string.h>
#include <unistd.h>
int main()
{
MyFile* filep = MyFopen("./log.txt", "a");
if (!filep)
{
printf("fopen error!\n");
return 1;
}
int cnt = 10;
while (cnt--)
{
char* msg = (char*)"hello myfile!!!";
MyFwrite(filep, msg, strlen(msg));
MyFFlush(filep);
printf("buffer: %s\n", filep->outbuffer);
sleep(1);
}
MyFclose(filep); // FILE *fp
return 0;
}