名簿作成2

最終更新日:2004-06-22.

今回は、以前作成した名簿ソフトを修正してみたいと思います。
少し舞え、構造体のところで作成してみましたが、
データの入力とそれを表示するところまで行いました。
今回は、ファイルに出力、ファイルから入力、
メニュー部分でのキー入力などです。
これだけではまだまだ十分ではありません。
それに、データの修正、細かなエラー処理などが必要です。
ソース内の処理について、まだ説明していないものが多数ありますが、
それは後々説明していきたいと思います。
まだよく分からない人はこんなものかでよいです。
分かる人は、さらに手を加えてみるのもおもしろいでしょう。

では、ソースにしてみましょう。
+------------------------------------------------------------+
/* filename=no015-1.c */
/* include */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
/* define */
#define MAXBUFF 30
/* struct */
struct group{
int num;
char name[32];
int nenrei;
char seibetsu;
};
/* 関数プロトタイプ宣言 */
int s_write(struct group *x, int i);
int s_read(struct group *x, int total);
char getkey(void);
int s_filewrite(struct group *x, int total, FILE *fp_r);
int s_fileread(struct group *x, FILE *fp_r);
/* main */
int main( )
{
FILE *fp_r;
int i, total;
char c;
char file1[32];
/* 構造体配列 */
struct group x[MAXBUFF];
/* csv file */
strcpy(file1, "member.csv");
/* fopen read and write */
if( (fp_r=fopen(file1, "r+"))==NULL ){
fclose(fp_r);
if( (fp_r=fopen(file1, "w+"))==NULL )
exit(1);
}
total=0;
/* menu */
while( 1 ){
/* キーを受け取る */
c=getkey();
/* 終了するには */
if( c<=27 )
break;
if( c=='W' ){
/* データ入力 */
i=total;
total=s_write(&x[i], i+1);
}
if( c=='R' ){
/* 内容を表示 */
s_read(&x[0], total);
}
if( c=='S' ){
/* ファイルへ出力 */
rewind(fp_r);
total=s_filewrite(&x[0], total, fp_r);
printf("%d件のデータを保存しました。\n", total);
}
if( c=='F' ){
/* ファイルから入力 */
total=s_fileread(&x[0], fp_r);
if( total<0 )
total=0;
printf("%d件のデータを読み込みました。\n", total);
}
}
return 0;/* 終了 */
}
/* データ入力*/
int s_write(struct group *x, int i)
{
int j;
char wk[8];
while( i<MAXBUFF ){
printf("番号[%d]:", i);
gets(wk);
if( (j=atoi(wk))<=0 ){
i--;
return i;
}
(x->num)=j;
printf("名前:");
gets(x->name);
printf("年齢:");
gets(wk);
j=atoi(wk);
x->nenrei=j;
printf("性別(J/L):");
while( 1 ){
gets(wk);
if( wk[0]=='J' || wk[0]=='L' )
break;
}
x->seibetsu=wk[0];
i++;
x++;
}
return i;/* 戻る */
}
/* 内容を表示 */
int s_read(struct group *x, int total)
{
int i;
i=0;
while( i<total ){
printf("番号:%d\n", x->num);
printf("名前:%s\n", x->name);
printf("年齢:%d\n", x->nenrei);
printf("性別:");
if( x->seibetsu=='J' )
printf("男性\n");
else
printf("女性\n");
i++;
x++;
}
return 0;/* 戻る */
}
/* キーを受け取る */
char getkey(void)
{
char c;
printf("キーを押してください。 ");
c=getche();
if( ('a'<=c) && (c<='z') )
c-=('a'-'A');
putchar('\n');
return c;/* 戻る */
}
/* ファイルへ出力 */
int s_filewrite(struct group *x, int total, FILE *fp_r)
{
int i;
/* file sizeを0にする */
chsize(fileno(fp_r), 0);
i=0;
while( i<total ){
fprintf(fp_r, "%d,%s,%d,%c\n", (x->num), (x->name), (x->nenrei), (x->seibetsu));
i++;
x++;
}
return i;/* 戻る */
}
/* ファイルから入力 */
int s_fileread(struct group *x, FILE *fp_r)
{
int i;
char *p, *q;
char wk[256];
i=0;
while( 1 ){
/* 1行読む */
if( fgets(wk, 512, fp_r)==NULL )
break;
/* 改行コードを削除 */
if( (p=strchr(wk, '\n'))!=NULL )
(*p)='\0';
p=&wk[0];
if( (q=strchr(p, ','))!=NULL ){
(*q)='\0';
(x->num)=atoi(p);
p=q+1;
}
if( (q=strchr(p, ','))!=NULL ){
(*q)='\0';
strcpy(x->name,p);
p=q+1;
}
if( (q=strchr(p, ','))!=NULL ){
(*q)='\0';
(x->nenrei)=atoi(p);
p=q+1;
}
(x->seibetsu)=(*p);
i++;
x++;
}
return i;/* 戻る */
}
+------------------------------------------------------------+

上記のソースをコンパイルして実行すると以下のように表示されました。
キーを押してください。

また、member.csvという名前のファイルに以下のような
データを保存してみました。
1,tarou,14,J
2,hanako,11,L

戻る