?? file_demo.c
字號:
/************************************************************************/
/* file_demo.c
文件系統(tǒng)函數(shù)操作:
在exist菜單中,首先通過鍵入值判斷文件是否存在,若不存在則創(chuàng)建相應(yīng)的文件;
在open菜單中,列出已經(jīng)判斷存在的文件,通過選擇可以實現(xiàn)對應(yīng)文件6種不同方式的打開;
在seek菜單中, 確定文件指針的偏移量,可以選擇從文件頭,文件現(xiàn)在的指針位置以
及文件尾三種方式進行定位;
在read和write菜單中,分別列出以對應(yīng)方式打開的文件:
在read菜單中,可以得到文件的長度,文件的指針偏移量,以及每按一次讀出10個字節(jié)的文件內(nèi)容并顯示;
在write菜單中,可以選擇鍵入一定的文件內(nèi)容或者是鍵入特定的11個字節(jié)的字符串;
Copyright (c) 2006 by Thinta Co.LTD
All rights reserved
*/
/************************************************************************/
#include "..\inc\Bio_Func.h"
#include "..\inc\key.h"
#include <STRING.H>
#include <STDIO.H>
#define FALSE 0x00
#define TRUE 0x01
#define NORMALCOLOR 1
#define NONECOLOR 0
#define CHINESEMODE 1
#define ENGLISHMODE 0
/****************************主菜單函數(shù)聲明****************************/
U8 file_tst(void);
/* ************************菜單子目錄實現(xiàn)函數(shù)聲明*************************/
void f_exist(void);
void f_open(void);
void f_seek(void);
void f_read(void);
void f_write(void);
void f_close(void);
/****************************其他函數(shù)聲明****************************/
S32 _read_data(void);
U8 string_key(U8* str, U8 len_str);
void row_name(U8 px, U8 py, U8 row, U8* name);
void _prtf(U8 x, U8 y, U8* flg, S32 data);
void _PutString( U8 x,U8 y,U8 *str )
{
_gotoxy(x,y);
_putstr(str);
}
/*****************************全局變量定義*****************************/
FILE *g_fp[8] = NULL ;
U8 g_filename[8][36] = {0} ;
U8 g_opennum = 0 ; //記錄現(xiàn)在使用的是第幾個
U8 g_opencount = 0 ; //記錄打開的文件的總數(shù)
U8 g_open[8] = {0} ; //和fp[8]相對應(yīng),0-沒有打開的文件, 1-有打開的文件
U8 g_testcount = 0 ; //證明存在的文件總數(shù)
U8 g_readorwrite[8] = {0} ; //記錄文件是以讀打開還是寫打開, 1-讀, 2-寫,3-創(chuàng)建,4-其他
U8 g_readcount = 0 ; //讀文件個數(shù)
U8 g_writecount = 0 ; //寫文件個數(shù)
void main (void)
{
//系統(tǒng)初始化
InitHeap() ;
_sysinit();
_file_sys_init();
_setscreenmode(CHINESEMODE);
_setdispcolor(NORMALCOLOR);
_setkeymode(2);
//顯示首頁
_cls();
_PutString(2, 2, "文件系統(tǒng)函數(shù)使用");
_PutString(3, 4, "時間:06.05.18");
_PutString(1, 6, "By Thinta Co.LTD");
//按鍵進入菜單選項頁
_bioskey(0);
while(1)
{
//運行菜單程序,若按退出鍵則退出程序
if(!file_tst())
break;
}
}
U8 file_tst(void)
{
U8* fMenu[] = { "1._fexist", "2._fopen", "3._fseek",
"4._fread", "5._fwrite", "6._fclose"}; //菜單內(nèi)容
S16 fChoice; //菜單按鍵選擇
//建立主菜單
while(1)
{
_cls();
_PutString(0, 1, " -file func- ");
fChoice = PopUpMenu(5, 2, 14, 9, fMenu, "123456", 6, 6, fChoice, 0, 0, NULL, 0 );
switch(fChoice)
{
case 0 : return 0;
break;
case 1 : f_exist();
break;
case 2 : f_open();
break;
case 3 : f_seek();
break;
case 4 : f_read();
break;
case 5 : f_write();
break;
case 6 : f_close();
break;
default:
return 0;
}
}
_fcloseall();
}
void f_exist(void)
{
U8 sName[10] = {0} ; //文件名
U8 sSuf[4] = {0} ; //后綴名
U8* dir = NULL; //路徑
FILE* pfile = NULL; //文件指針
_cls();
//路徑初始化
dir = malloc(30);
memset(dir, 0, 30);
strcpy(dir, "d:\\");
_PutString(0, 0, "當(dāng)前路徑:");
_putstr(dir);
//鍵入文件名
_PutString(0, 1, "文件名:");
if (string_key(sName, 10) == 0)
{
free(dir);
return;
}
//鍵入后綴名
_PutString(0, 2, "后綴名:");
if (string_key(sSuf, 4) == NULL)
{
free(dir);
return;
}
//得到全路徑名
strcat(dir, sName);
strcat(dir, ".");
strcat(dir, sSuf);
_PutString(0, 4, dir);
//判斷文件是否存在,若不存在則創(chuàng)建,并且將文件名記入g_filename[]
_gotoxy(0, 5);
if( !_fileexist(dir))
{
memset(g_filename[g_testcount],0,36);
memcpy(g_filename[g_testcount], dir, strlen(dir));//記入已經(jīng)證實存在的文件
_putstr("文件存在");
g_testcount++;
}
else
{
_putstr("文件不存在\n");
pfile = _fopen( dir, "a+" );
if (!pfile)
_putstr("創(chuàng)建文件失敗!");
else
{
memset(g_filename[g_testcount],0,36);
memcpy(g_filename[g_testcount], dir, strlen(dir));//記入新建文件
_putstr("創(chuàng)建文件成功!");
_fclose(pfile);
g_testcount++;
}
}
_bioskey(0);
}
void f_open(void)
{
S16 Key ; //按鍵
U8 i, row = 1 ; //row是行號
U8 seq[8] = {0} ; //存放對應(yīng)于行號的文件序數(shù)
U8* readmode = NULL ; //記錄用戶選擇的文件打開模式
U8 rw_mode[6] = {1, 2, 3, 4, 4, 4}; //記錄用戶打開的不同方式,以在下面的文件讀寫操作中分類
FILE* pfile = NULL ; //打開文件指針
_cls();
_PutString(0, 1, "選擇文件打開:\n");
//輸出能夠打開的文件
for ( i = 0; i < g_testcount; 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 )
g_opennum = seq[(U8)(Key - NUMBER_1)];
else
return;
//輸出選擇打開的文件
_cls();
_PutString(0, 1, "選擇的文件為:\n");
_putstr(g_filename[g_opennum]);
//選擇打開方式
_PutString(0, 3, "選擇打開方式:\n");
_putstr("1.r, 2.w, 3.a\n4.r+, 5.w+, 6.a+");
Key = _bioskey(0);
switch(Key)
{
case NUMBER_1: readmode = "r";
break;
case NUMBER_2: readmode = "w";
break;
case NUMBER_3: readmode = "a";
break;
case NUMBER_4: readmode = "r+";
break;
case NUMBER_5: readmode = "w+";
break;
case NUMBER_6: readmode = "a+";
break;
default: readmode = "r";
break;
}
//打開文件
pfile = _fopen(g_filename[g_opennum],readmode);
if(NULL == pfile)
_PutString(0, 6, "打開文件失敗");
else
{
_PutString(0, 6, "打開文件成功");
g_open[g_opennum] = 1 ; //標(biāo)志文件已打開
g_fp[g_opennum] = pfile; //記錄文件指針
(g_opencount)++; //打開文件個數(shù)加一
//以數(shù)字方式記錄文件打開方式以在讀寫菜單操作中進行判斷
if(Key >= NUMBER_1 && Key <= NUMBER_6 )
{
g_readorwrite[g_opennum] = rw_mode[(U8)(Key - NUMBER_1)];
if (Key == NUMBER_1 || Key == NUMBER_4 || Key == NUMBER_5
|| Key == NUMBER_6)
g_readcount++;
if (Key == NUMBER_2 || Key == NUMBER_3 || Key == NUMBER_4
|| Key == NUMBER_5 || Key == NUMBER_6)
g_writecount++;
}
else
return;
}
_bioskey(0);
}
void f_seek(void)
{
S16 choice; //菜單選擇
U16 whence; //定位方式
S32 pos_result, key;
U8 i, row = 1 ; //row是行號
U8 seq[8] = {0} ; //記錄序號
S32 offset = 0 ; //offset是指針偏移
char* menu[] = {"1.SEEK_SET", "2.SEEK_CUR", "3.SEEK_END"};
_cls();
_PutString(0, 1, "選擇定位文件:\n");
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 ((key - NUMBER_1) < g_opencount)
g_opennum = seq[(U8)(key - NUMBER_1)];
else
return;
}
else
return;
_cls();
_PutString(0, 1, "選擇定位的文件為:\n");
_putstr(g_filename[g_opennum]);
_PutString(0, 4, "offset:");
offset = _read_data();
if (offset == ESC)
return;
_cls();
_gotoxy(0,1);
choice = PopUpMenu(2, 2, 13, 5, menu, "123", 3, 3, choice, 1, 0, NULL, 0);
switch(choice)
{
case 0 : return;
break;
case 1 : whence = 0;
break;
case 2 : whence = 1;
break;
case 3 : whence = 2;
break;
default :
break;
}
pos_result = _fseek(g_fp[g_opennum], offset, whence);
if (pos_result == 0)
_PutString(0, 7, "定位成功!");
else
_PutString(0, 7, "定位失敗!");
_bioskey(0);
}
void f_read(void)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -