以下コードです。
//読み込みファイル
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp; //ファイルポインタ
char *fname = "comma.csv"; //ファイル名
//会員メンバ構造体
struct member {
int no;
char name[20];
char adress[20];
char tel[20];
char mail[20];
};
/*メイン関数*/
main()
{
int no; //数字の入力値
int ret; //関数の返り値
printf("---会員管理システムメニュー---\n\n");
printf("1.新規登録\n");
printf("2.変更\n");
printf("3.削除\n");
printf("4.一覧表示\n");
printf("No? ");
ret=scanf("%d",&no); //数値を入力
//1の時
if(no == 1)
{
ret = add_record(); //新規追加
}
//2の時
else if(no == 2)
{
ret = update_record(); //更新処理
}
//3の時
else if(no == 3)
{
ret = del_record(); //削除処理
}
//4の時
else if(no == 4)
{
ret = disp_record(); //一覧表示
}
}
/*新規登録*/
int add_record()
{
struct member member[20]={0}; //メンバ構造体配列の宣言
int choice; //決定の入力値
int i=0; //配列の番号
printf("\n会員番号(0-10数値)? ");
scanf("%d",&(member[i].no)); //会員番号
printf("会員名称(漢字,英語)? ");
scanf("%s",member[i].name); //名前
printf("住所(漢字,数字50文字)? ");
scanf("%s",member[i].adress); //住所
printf("電話番号(半角文字-で区切る)? ");
scanf("%s",member[i].tel); //電話番号
printf("メールアドレス(半角英数字)? ");
scanf("%s",member[i].mail); //メールアドレス
printf("新規登録しますか?(1:yes 2:no)? ");
scanf("%d",&choice); //番号の入力
//新規登録しない時
if(choice == 2)
{
system("cls"); //コマンドプロンプトの画面クリア
main(); //メイン関数
}
fp = fopen(fname,"a"); //上書きモードでファイルを開く
//ファイルポインタがNULLの時
if(fp == NULL)
{
printf("%sファイルが開けません\n",fname);
return -1; //エラー値として-1を返す
}
//ファイルへ出力する
fprintf(fp,"%d,%s,%s,%s,%s\n",member[i].no,member[i].name,member[i].adress,member[i].tel,member[i].mail);
fclose(fp); //ファイルを閉じる
printf("%sファイル書き込みが終わりました\n",fname);
return 0;
}
/*更新処理*/
int update_record()
{
struct member member[20]={0}; //メンバ構造体配列の宣言
int no; //入力した会員番号
int choice=0; //入力した番号
int ret; //返り値
int i=0; //構造体配列の番号
int g=0; //構造体配列の番号
printf("\n会員番号(0-10数値)? ");
scanf("%d",&no); //会員番号の入力
fp = fopen(fname,"r"); //ファイルを読み込みモードでオープン
//ファイルポインタがNULLの時
if(fp == NULL)
{
printf("%sファイルが開けません\n",fname);
return -1; //エラー返り値として-1を返す
}
//ファイル読み込み終了まで繰り返す
while(feof(fp)==0)
{
//ファイルからデータを読み込む
if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%s",&(member[i].no),member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
{
//入力番号と配列の番号が等しい時
if(no==member[i].no)
{
printf("%s\n",member[i].name);
scanf("%s",member[i].name); //名前
printf("%s\n",member[i].adress);
scanf("%s",member[i].adress); //住所
printf("%s\n",member[i].tel);
scanf("%s",member[i].tel); //電話番号
printf("%s\n",member[i].mail);
scanf("%s",member[i].mail); //メールアドレス
printf("%s\n","変更登録しますか?(1:yes 2:no) ");
scanf("%d",&choice); //番号入力
//変更登録しない場合
if(choice==2)
{
system("cls"); //コマンドプロンプトの画面をクリア
main(); //メイン関数に戻る
}
}
}
i++;
}
fclose(fp); //ファイルを閉じる
fp = fopen(fname,"w"); //書き込みモードでオープンしファイルをクリア
fclose(fp); //ファイルを閉じる
fp = fopen(fname,"w"); //書き込みモードでファイルをオープン
//配列の中身を全て取り出す
while(g<i-1)
{
fprintf(fp,"%d,%s,%s,%s,%s\n",member[g].no,member[g].name,member[g].adress,member[g].tel,member[g].mail);
g++;
}
fclose(fp); //ファイルを閉じる
printf("%s","ファイル書き込みが終わりました");
return 0;
}
/*削除処理*/
int del_record()
{
struct member member[20]={0}; //メンバ情報構造体配列の宣言
struct member member1 = {EOF,EOF,EOF,EOF,EOF}; //構造体配列の終端値
int no; //会員番号の出力値
int choice=0; //削除決定値
int i=0; //構造体の番号
int ret; //関数の返り値
printf("\n会員番号(0-10数値)? ");
scanf("%d",&no); //会員番号の入力
ret = csv_read(); //ファイルの読み込み関数
//ファイル読み込み終了まで繰り返す
while(feof(fp)==0)
{
//ファイルからデータを読み込み、構造体配列に格納
if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%s",&(member[i].no),member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
{
//キーボードの入力値と構造体配列の番号が一致する時
if(no==member[i].no)
{
printf("\n%d",member[i].no); //会員番号
printf("\n%s",member[i].name); //名前
printf("\n%s",member[i].adress); //住所
printf("\n%s",member[i].tel); //電話番号
printf("\n%s",member[i].mail); //メールアドレス
printf("\n%s","削除しますか?(1:yes 2:no)? ");
scanf("%d",&choice); //選択値を入力
//削除しない時
if(choice==2)
{
system("cls"); //コマンドプロンプト画面クリア
main(); //メイン関数に戻る
}
}
}
i++;
}
i--;
member[i]=member1; //構造体配列に終端値を代入
i = 0;
fclose(fp); //ファイルを閉じる
fp = fopen(fname, "w"); //書き込みモードでオープンしファイルをクリア
fclose(fp); //ファイルを閉じる
fp = fopen(fname, "w"); //ファイルを書き込みモードでオープン
//会員番号がEOFでない場合
while(member[i].no!=EOF)
{
//入力した会員番号と配列内の会員番号が等しくない時
if(no!=member[i].no)
{
fprintf(fp,"%d,%s,%s,%s,%s\n",member[i].no,member[i].name,member[i].adress,member[i].tel,member[i].mail);
}
i++;
}
fclose(fp);
printf("%s","削除されました。");
return 0;
}
/*一覧表示*/
int disp_record()
{
struct member member[20]={0};//構造体メンバ宣言
int choice=0;//キーボード入力値格納変数
int i=0;//構造体配列の番号
//読み込みモードでファイルをオープン
fp = fopen(fname,"r");
//ファイルポインタがNULLの場合
if(fp == NULL)
{
printf("%sファイルが開けません\n",fname);
return -1; //-1をエラー返り値として返す
}
//ファイル読み込み終了まで繰り返す
while(feof(fp)==0)
{
//ファイルからデータを読み込み、構造体配列に格納
if((fscanf(fp,"%d,%[^,],%[^,],%[^,],%s",&(member[i].no),member[i].name,member[i].adress,member[i].tel,member[i].mail)) != EOF)
{
printf("\n%d",member[i].no); //番号
printf("\n%s",member[i].name); //名前
printf("\n%s",member[i].adress); //住所
printf("\n%s",member[i].tel); //電話番号
printf("\n%s",member[i].mail); //メールアドレス
}
}
printf("\n\n%s\n","メニューに戻ります。1:yes");
scanf("%d",&choice); //メニューに戻るための入力
//入力値が1の場合
if(choice==1)
{
system("cls"); //コマンドプロンプトの表示クリア
main(); //メイン関数に戻る
}
fclose(fp); //ファイルを閉じる
return 0;
}
int csv_read()
{
fp = fopen(fname,"r"); //ファイルを読み込みモードで開く
//ファイルポインタがNULLかどうか判定
if(fp == NULL)
{
printf("%sファイルが開けません\n",fname);
return -1; //エラーの返り値として-1を返す
}
}
fprintf(fp,"%d,%s,%s,%s,%s\n",member.no,member.name,member.adress,member.tel,member.mail);の部分を関数化したいのですがうまくいきません。どう書けばよいでしょうか?
int csv_write()
{
}