下記の条件で構造体を用いた簡易住所録を作成。
・レコード内容:ID(2ケタ)、氏名、住所(簡単なもの)
・参照・追加・更新・削除が可能
・最初から5件分のメモリ領域を確保しておき、
6件以上登録する場合は随時動的にメモリを確保する(制限無し)
・[Ctrl+c]を押すことで現在の情報をディスク上へファイルとして生成
問題1のプログラム
#define DEFALUT_NUM 5 /* Global Variable*/ typedef struct { int id; char name[15]; char address[200]; int delflag; } card_t; card_t *info,*tmp_info; int current_id=1; /*Function*/ void genCSV() { int i=1; FILE *fp; fp = fopen("test.dat","w"); if( fp==NULL ){ fprintf(stderr,"test.dat can not be opened!\n"); } while ( i < current_id ) { if ( info[i].delflag == 0 ) { fprintf(fp,"%d,%s,%s\n",info[i].id,info[i].name,info[i].address); } i++; } fclose(fp); } /* FLG */ /*Signal Handle*/ void endfunc() { genCSV(); free(info); exit(0); } typedef void (*handler_t) (int); static int sigHandlerSet(int sig, handler_t handler) { struct sigaction new_action; struct sigaction old_action; memset( &new_action, 0, sizeof( struct sigaction ) ); new_action.sa_handler = handler; /* Temporarily block all other signals during handler execution */ sigfillset ( &new_action.sa_mask ); /* Auto restart syscalls after handler return */ new_action.sa_flags = SA_RESTART; if ( sigaction( sig, NULL, &old_action ) != 0 ) { return -1; } /* Honor inherited SIG_IGN that's set by some shell's */ if ( old_action.sa_handler != SIG_IGN ) { if ( sigaction( sig, &new_action, NULL ) != 0 ) { return -1; } } return 0; } int HandleSignals( void ) { if (sigHandlerSet(SIGINT, endfunc) != 0) return -1; return 0; } void selectAll() { int i=1; int flag = 0; while( i < current_id ) { if ( info[i].delflag == 0 ) { fprintf(stdout,"id=%d,name=%s,address=%s\n",info[i].id,info[i].name,info[i].address); flag = 1; } i++; } if ( flag == 0 ) { fprintf(stdout,"not found!\n"); } } int selectId(int pid) { int i=1; int flag=0; while( i < current_id ) { if ( info[i].id == pid && info[i].delflag == 0 ) { fprintf(stdout,"id=%d,name=%s,address=%s\n",info[i].id,info[i].name,info[i].address); flag = 1; break; } i++; } return flag; } void insert(char *name,char *address) { if ( current_id > DEFALUT_NUM ) { tmp_info = (card_t*)realloc(info,(current_id + 1) * sizeof(card_t)); info = tmp_info; } info[current_id].delflag = 0; info[current_id].id = current_id; sprintf(info[current_id].name,"%s",name); sprintf(info[current_id].address,"%s",address); fprintf(stdout,"stored with id=%d\n",info[current_id].id); current_id++; } void delete(int pid) { info[pid].delflag = 1; } void update(int pid,char *name,char *address) { sprintf(info[pid].name,"%s",name); sprintf(info[pid].address,"%s",address); } void printMenu() { fprintf(stdout,"Please choose a number from following!\n"); fprintf(stdout,"1 -> select\n"); fprintf(stdout,"2 -> insert\n"); fprintf(stdout,"3 -> update\n"); fprintf(stdout,"4 -> delete\n\n"); fprintf(stdout,"menu num[1-4] = "); } int main(void) { char c[2]; int i; int input=0; int id=-1; int rc=0; char name[15]; char address[200]; info = (card_t*) malloc ( sizeof(card_t) * (DEFALUT_NUM + 1) ); for( i = 0; i < DEFALUT_NUM; i++ ) { info[i].id = 0; info[i].delflag = 0; } if ( ( rc = HandleSignals()) != 0 ) exit(-1); while ( 1 ) { printMenu(); scanf("%d",&input); switch(input) { case 1: fprintf(stdout,"id(-1:ALL, or id > 0)-> "); scanf("%d",&id); if ( id < 0 ) { selectAll(); } else { if ( ! selectId(id) ) { fprintf(stdout,"not found!\n"); }; } break; case 2: fprintf(stdout,"name-> "); scanf("%s",name); fprintf(stdout,"address-> "); scanf("%s",address); insert(name,address); break; case 3: fprintf(stdout,"id-> "); scanf("%d",&id); if ( id > 0 ) { if( selectId(id) ) { fprintf(stdout,"name-> "); scanf("%s",name); fprintf(stdout,"address-> "); scanf("%s",address); update(id,name,address); } else { fprintf(stdout,"not found id = %d!\n",id); } } else { fprintf(stderr,"Please set correct id!\n"); } break; case 4: fprintf(stdout,"id-> "); scanf("%d",&id); if ( id > 0 ) { if( selectId(id) ) { delete(id); } else { fprintf(stdout,"not found id = %d!\n",id); } } else { fprintf(stderr,"Please set correct id!\n"); } break; default: break; } fprintf(stdout,"do you exit this program?[y|n] "); scanf("%s",c); if ( c[0] == 'y' ) { endfunc(); } fprintf(stdout,"\n\n"); }; free(info); return 0; }
忙しさにかまけて、ちゃんと理解できないところがあるので復習しなきゃ。。。
次はpythonへ...