C语言 用open read write函数实现fopen fread fwrite
所在工程:SDL_lua
typedef struct _iobuf
{
// char* _ptr; //文件名??
// int _cnt;
// char* _base;
// int _flag;
int _file; //进程级文件表 记录文件打开数
// int _charbuf;
// int _bufsiz;
char *_tmpfname;
} FILE;
FILE *fopen(const char *path, const char *mode)
{
int file_mode = 0;
int seek_mode = SEEK_SET;
if (strrcmp(mode, "r") == 0)
{ //以只读方式打开文件,该文件必须存在。
file_mode = O_RDONLY;
}
else if (strcmp(mode, "r+") == 0)
{ //以读/写方式打开文件,该文件必须存在。
file_mode = O_RDONLY | O_WRONLY;
}
else if (strcmp(mode, "rb+") == 0)
{ //以读/写方式打开一个二进制文件,只允许读/写数据。
file_mode = O_RDONLY | O_WRONLY;
}
else if (strcmp(mode, "rt+") == 0)
{ //以读/写方式打开一个文本文件,允许读和写。
file_mode = O_RDONLY | O_WRONLY;
}
else if (strcmp(mode, "w") == 0)
{ //打开只写文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件。
file_mode = O_WRONLY | O_CREAT;
remove(path);
}
else if (strcmp(mode, "w+") == 0)
{ //打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
file_mode = O_RDONLY | O_WRONLY | O_CREAT;
remove(path);
}
else if (strcmp(mode, "a") == 0)
{ //以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。
file_mode = O_WRONLY;
seek_mode = SEEK_END;
}
else if (strcmp(mode, "a+") == 0)
{ //以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留)。
file_mode = O_RDONLY | O_WRONLY;
seek_mode = SEEK_END;
}
else if (strcmp(mode, "wb") == 0)
{ //以只写方式打开或新建一个二进制文件,只允许写数据。
file_mode = O_WRONLY;
}
else if (strcmp(mode, "wb+") == 0)
{ //以读/写方式打开或建立一个二进制文件,允许读和写。
file_mode = O_RDONLY | O_WRONLY;
}
else if (strcmp(mode, "wt+") == 0)
{ //以读/写方式打开或建立一个文本文件,允许读写。
file_mode = O_RDONLY | O_WRONLY;
}
else if (strcmp(mode, "at+") == 0)
{ //以读/写方式打开一个文本文件,允许读或在文本末追加数据。
file_mode = O_RDONLY | O_WRONLY;
seek_mode = SEEK_END;
}
else if (strcmp(mode, "ab+") == 0)
{ //以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
file_mode = O_RDONLY | O_WRONLY;
seek_mode = SEEK_END;
}
int f = open(path, mode);
if (f != 0)
{
lseek(f, 0, seek_mode);
FILE *file = malloc(sizeof(FILE));
file->_tmpfname = path;
file->_file = f;
return file;
}
return NULL;
}
unsigned int fread(void *buf, size_t size, size_t count, FILE *f)
{
int re = read(f->_file, buf, size * count);
if (re == -1)
return -1;
else
{
int count = re % size;
lseek(f->_file, -count, SEEK_CUR);
return re / size;
}
}
int fseek(FILE *f, long offset, int mode)
{
return lseek(f->_file, offset, mode);
}
unsigned int fwrite(const void *buf, size_t size, size_t count, FILE *f)
{
int re = write(f->_file, buf, size * count);
if (re == -1)
return -1;
else
return re / size;
}
int fflush(FILE *f)
{
return close(f);
}
int fclose(FILE *f)
{
return close(f);
}