📄 rb_file.c
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <rb_mem.h>
#include <string.h>
#include <rb_stdio.h>
#include <rb_string.h>
#define mod_rd 1 //只读方式
#define mod_wt 2 //只写方式
#define mod_rn 3 //随机方式
#define mod_ap 4 //追加方式
#define mod_cl 5 //关闭文件
#define mod_er 6 //错误文件
#define max_fid 4 //最大文件号
extern u32 myfopen(char *fname,u32 *size);
typedef struct
{
char *loc;//文件起始处
u32 size;//文件大小
u32 np;//当前指针
u8 mod;//打开模式
} rb_file;
rb_file *rb_files;//文件打开信息
void rb_fopen(char *name,u8 fid,u8 fmod)
{
if (fid>3) return;
if (rb_files[fid].mod!=mod_cl)//文件打开错误
{
rb_error=17;
return;
}
str_up(name);
if (strcmp(name,"MEMORY")==0) {rb_files[fid].loc=rb_peek_M;rb_files[fid].size=2048;}//内存文件
else rb_files[fid].loc=(char *)myfopen(name,&rb_files[fid].size);
if (fmod==mod_ap) rb_files[fid].np=rb_files[fid].size-1;
else rb_files[fid].np=0;
rb_files[fid].mod=fmod;
}
void rb_fclose(u8 fid)
{
if (fid>3)
{
rb_error=19;
return;
}
rb_files[fid].mod=mod_cl;
}
void rb_fseek(u8 fid,u32 loc)
{
if (rb_files[fid].mod==mod_cl || rb_files[fid].mod==mod_er || fid>3)
{
rb_error=18;
return;
}
if (loc<rb_files[fid].size) rb_files[fid].np=loc;
else rb_files[fid].np=rb_files[fid].size;
}
u32 rb_ftell(u8 fid)
{
if (fid>3 || rb_files[fid].mod==mod_cl
|| rb_files[fid].mod==mod_er) return 0;
return rb_files[fid].np;
}
u8 rb_feof(u8 fid)
{
if (fid>3 || rb_files[fid].mod==mod_cl || rb_files[fid].mod==mod_er
|| rb_files[fid].np>=rb_files[fid].size ) return 1;
return 0;
}
void rb_fread(u8 fid,void *sv,u32 size)
{
int sp=0;
if (fid>3 || rb_files[fid].mod==mod_wt || rb_files[fid].mod==mod_er
|| rb_files[fid].np==mod_cl || rb_files[fid].np>=rb_files[fid].size)
{
rb_error=20;
return;
}
while (sp<size && rb_files[fid].np<rb_files[fid].size)
{
*((char *)sv+sp)=*(char *)(rb_files[fid].loc+rb_files[fid].np);
rb_files[fid].np++;
sp++;
}
}
void rb_fwrite(u8 fid,void *sv,u32 size)
{
int sp=0;
if (fid>3 || rb_files[fid].mod==mod_rd || rb_files[fid].mod==mod_er
|| rb_files[fid].mod==mod_cl || rb_files[fid].np>=rb_files[fid].size)
{
rb_error=21;
return;
}
while (sp<size && rb_files[fid].np<rb_files[fid].size)
{
rb_files[fid].loc[rb_files[fid].np]=*((char *)sv+sp);
rb_files[fid].np++;
sp++;
}
}
void rb_file_init()
{
int i;
rb_files=(rb_file *)mymalloc(sizeof(rb_file)*max_fid);
if (rb_files==NULL) {rb_error=1;return;}
for (i=0;i<max_fid;i++) rb_files[i].mod=mod_cl;
}
void rb_file_free()
{
myfree(rb_files);
}
void rb_close_files()
{
int i;
for (i=0;i<4;i++) rb_files[i].mod=mod_cl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -