所在工程: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);
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注