📄 file_demo.c
字号:
U8 i, row = 1;
U8 buffer[11] = {0} ; //存放读出来的字符
U8 seq[8] = {0} ; //记录序号
S32 key, size;
_cls();
_PutString(0, 1, "可读文件:\n");
//列出可读文件
for(i=0;i<8;i++)
{
if(g_open[i] == 1)
{
if(g_readorwrite[i] == 1 || g_readorwrite[i] == 4)
{
seq[row - 1] = i;
row_name(0, row+1, row, g_filename[i]);
row++;
}
}
}
//选择文件读
key = _bioskey(0);
if(key >= NUMBER_1 && key <= NUMBER_8 )
{
if ((key - NUMBER_1) < g_readcount)
g_opennum = seq[(U8)(key - NUMBER_1)];
else
return;
}
else
return;
//输出选择读的文件名
_cls();
_PutString(0, 1, "读出文件\n");
_putstr(g_filename[g_opennum]);
//文件长度
size = _filelength(g_fp[g_opennum]);
_PutString(0, 4, "文件长度:");
_prtf(200, 200, "%u", size);
//读文件
while(_bioskey(0) != ESC)
{
size = _fread(buffer, 10, g_fp[g_opennum]);
//10字节一次输出读出的文件内容
_clsn(5, 4);
if(size > 0)
{
_PutString(0, 5, "读出的实际字节数:");
_prtf(200, 200, "%d" , size);
_putstr(" \n");
_putstr(buffer);
memset(buffer, 0, 11);
}
else
_PutString(0, 6, "读出文件失败!") ;
//文件指针偏移
size = _ftell(g_fp[g_opennum]);
_PutString(0, 8, "指针偏移:");
_prtf(200, 200, "%d", size);
}
}
void f_write(void)
{
S32 size, file_len;
S16 key;
U8 row = 1, i; //row是行号
U8 seq[8] = {0}; //记录序号
U8 buf_w[256] = {0}; //写缓存
for (i = 0; i<255; i++)
{
buf_w[i] = i%26 + 'a';
}
//显示可写文件
_cls();
_PutString(0, 1, "可写文件数:");
_prtf(200, 200, "%u", g_writecount);
_gotoxy(0, 2);
for(i=0;i<8;i++)
{
if(g_open[i] == 1)
{
if(g_readorwrite[i] == 2 || g_readorwrite[i] == 3 || g_readorwrite[i] == 4)
{
seq[row - 1] = i;
row_name(0, row+1, row, g_filename[i]);
row++;
}
}
}
//选择可写文件
key = _bioskey(0);
if(key >= NUMBER_1 && key <= NUMBER_8 )
{
if ((U8)(key - NUMBER_1) < g_writecount)
g_opennum = seq[(U8)(key - NUMBER_1)];
else
return;
}
else
return;
//选择写的方式:1. 自动写入a-z的字符; 2. 手动写入
_cls();
_PutString(0, 1, "写文件:\n");
_putstr(g_filename[g_opennum]);
_PutString(0, 4, "请选择写入方式: \n1. 自动写入字符a-z\n2. 手动写入字符\n");
key = _bioskey(0);
//自动写入
if (key == NUMBER_1)
{
while(_bioskey(0) != ESC)
{
size = _fwrite(buf_w, strlen(buf_w), g_fp[g_opennum]);
file_len = _filelength(g_fp[g_opennum]);
//显示实际写入字符数以及文件长度
_cls();
_putstr("\n写入字符串'a-z'共255个字节\n");
_PutString(0, 5, "写入的实际字节数:");
_prtf(200, 200, "%d", size);
_PutString(0, 6, "文件长度:");
_prtf(200, 200, "%u", file_len);
}
}
//手动写入
else if (key == NUMBER_2)
{
U8 str_key[51] = {0};
while(_bioskey(0) != ESC)
{
_cls();
_PutString(0, 1, "请输入50个以内字符!\n");
string_key(str_key, 50);
size = _fwrite(str_key, strlen(str_key), g_fp[g_opennum]);
file_len = _filelength(g_fp[g_opennum]);
//显示实际写入字符数以及文件长度
_PutString(0, 5, "写入的实际字节数:");
_prtf(200, 200, "%d", size);
_PutString(0, 6, "文件长度:");
_prtf(200, 200, "%u", file_len);
memset(str_key, 0, 50);
}
}
else
return;
}
void f_close(void)
{
U16 key;
U8 seq[8] = {0}; //记录序数
U8 row = 1, i;
//显示可关闭文件
_cls();
_PutString(0, 1, "可关闭文件:");
_gotoxy(0, 2);
for(i=0;i<8;i++)
{
if(g_open[i] == 1)
{
seq[row - 1] = i;
row_name(0, row+1, row, g_filename[i]);
row++;
}
}
//选择关闭文件
key = _bioskey(0);
if(key >= NUMBER_1 && key <= NUMBER_8 )
{
if ((U8)(key - NUMBER_1) < g_opencount)
g_opennum = seq[(U8)(key - NUMBER_1)];
else
return;
}
else
return;
//关闭文件
if (!_fclose(g_fp[g_opennum]))
{
_PutString(0, 7, "正常关闭");
g_open[g_opennum] = 0;
g_fp[g_opennum] = 0;
g_opencount--;
if(g_readorwrite[g_opennum] == 1 || g_readorwrite[i] == 4)
g_readcount--;
else if(g_readorwrite[g_opennum] == 2 || g_readorwrite[i] == 3 || g_readorwrite[i] == 4)
g_writecount--;
}
else
_putstr("关闭文件出错!");
_bioskey(0);
}
/************************************************************************/
/* 数据输入 */
/************************************************************************/
S32 _read_data(void)
{
U16 ctemp = 0;
U8 sign = 0; //加减号标志
U8 signTime = 0; //加减号次数
S32 data = 0; //返回的最终输入数据
S32 tempdata = 0; //按键的临时数据
ctemp = _bioskey(0);
while (ctemp != ENTER)
{
tempdata = 11;
switch((U8)ctemp)
{
case 0x30 : tempdata = 0;
_putstr("0");
break;
case 0x31 : tempdata = 1;
_putstr("1");
break;
case 0x32 : tempdata = 2;
_putstr("2");
break;
case 0x33 : tempdata = 3;
_putstr("3");
break;
case 0x34 : tempdata = 4;
_putstr("4");
break;
case 0x35 : tempdata = 5;
_putstr("5");
break;
case 0x36 : tempdata = 6;
_putstr("6");
break;
case 0x37 : tempdata = 7;
_putstr("7");
break;
case 0x38 : tempdata = 8;
_putstr("8");
break;
case 0x39 : tempdata = 9;
_putstr("9");
break;
case ESC :
return ESC;
break;
default :
break;
}
if (tempdata < 10)
{
data = data * 10 + tempdata;
}
ctemp = _bioskey(0);
}
return data;
}
/************************************************************************/
/* 各种类型数据的输出 */
/************************************************************************/
void _prtf(U8 x, U8 y, U8* flg, S32 data)
{
U8 tmp[20] = {0};
if (x != 200 && y != 200)
_gotoxy(x, y);
sprintf(tmp, flg, data);
_putstr(tmp);
}
/************************************************************************/
/* 带序号文件名输出
void row_name(U8 px, U8 py, U8 row, U8* name)
输入:输出位置 px,py
行号 row; 行中需要显示的文件名串 name
*/
/************************************************************************/
void row_name(U8 px, U8 py, U8 row, U8* name)
{
_gotoxy(px, py);
_putch(48 + row);
_putstr(". ");
_putstr(name);
}
/************************************************************************/
/* U8 string_key(U8* str, U8 len_str)
输入:str:用于存放输入键值的字符串指针; len_str:字符串的最大长度
返回:若键入ESC则返回0, 否则返回1 */
/************************************************************************/
U8 string_key(U8* str, U8 len_str)
{
S16 Key; //接收键盘输入的键值
U8 len_fact = 0; //接收到的字符串长度
while(1)
{
if (len_fact >= len_str)
break;
Key = _bioskey(0);
//若按退出键则返回NULL,调用函数判断若为0,则跳出函数
if (Key == ESC)
return 0;
//输入ENTER表示字符串输入结束
if (Key == ENTER)
break;
//删除键
if (Key == DEL && len_fact >0)
{
len_str--;
str[len_str] = 0x00;
_putch(Key);
continue;
}
//记入并输出按键
_putch(Key);
str[len_fact] = Key;
len_fact++;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -