修正プログラム
Posted: 2011年9月07日(水) 18:05
・以前ここで質問させていただいたのですが、コメント1つ入れずにお願いしてしまい
大変失礼しました。
・未だフォーラムルールをよく理解していないため、行番号などが表示されないかも
しれませんがお許しくださると助かります。
・このプログラムで4を入力すると今まで入力したデータがリストとして表示するには
どうすればいいのか教えてください。よろしくお願いします。
大変失礼しました。
・未だフォーラムルールをよく理解していないため、行番号などが表示されないかも
しれませんがお許しくださると助かります。
・このプログラムで4を入力すると今まで入力したデータがリストとして表示するには
どうすればいいのか教えてください。よろしくお願いします。
#define FILENAME "wearex.txt"
#define RECORDLENGTH 88
//ヘッダーファイルの読み込み
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//プロトタイプ宣言
int menu(void); //メニュー選択画面
int txtread(void); //データ読み込み処理
int txtwrite(void); //データ書き込み処理
int txtcorrect(void); //データ修正処理
//データのフォーマット形式の設定
char *recformat = "%-15s %-3d %-2s %-63s\n";
int main(void) //メイン関数
{
int menuno; //メニュー番号
for(;;) //メニュー番号が選択されるまでループ
{
menuno = menu(); //メニュー番号選択
switch(menuno)
{
case 0: //プログラム終了
break;
case 1: //データ書き込み処理
txtwrite();
break;
case 2: //データ読み込み処理
txtread();
break;
case 3: //データ修正処理
txtcorrect();
break;
default: //その他の番号を入力された場合
printf("メニュー番号エラー\n");
break;
}
if( menuno == 0) //プログラム終了
{
break;
}
}
return 0;
}
int menu(void) //メニュー選択処理
{
char retno[8]; //入力されたメニュー番号
for(;;) //メニュー画面の表示
{
printf("**********************************\n");
printf("データの新規・追加書き込み->1\n");
printf("データの読み込み----------->2\n");
printf("データの修正--------------->3\n");
printf("終了----------------------->0\n");
printf("**********************************\n");
printf("番号を入力してください--->");
gets_s(retno,7);
retno[1] = '\0'; //入力の1桁目のみ判定
if(retno[0]<'0'||retno[0]>'3')
{
printf("0から3の番号を入力してください。\n");
continue;
}
return atoi(retno); //処理番号を戻す
}
}
int txtwrite(void)
{
FILE *fp; //ファイルポインタ
errno_t err; //ファイルエラー
char namae[16]; //氏名
int eigo; //英語
char kokugo[4]; //国語
char suugaku[64]; //数学
char work[8]; //入力用作業領域
err = fopen_s(&fp,FILENAME,"a"); //追加モードでオープン
if(err != 0) //ファイルオープンに成功したかチェック
{
perror("ファイルオープンに失敗しました。");
return -1;
}
for(;;) //データの入力&書き込み
{
//データの入力
printf("氏名:");
gets_s(namae,15);
printf("英語:");
gets_s(work,7);
eigo = atoi(work);
printf("国語:");
gets_s(kokugo,3);
printf("数学:");
gets_s(suugaku,63);
//データの書き込み
if(fprintf(fp,recformat,namae,eigo,kokugo,suugaku)<0)
{
perror("書き込みエラー");
break;
}
//入力継続の確認
printf("入力を続けますか?(Y or N):");
gets_s(work,7);
if(work[0]=='n'||work[0]=='N')
{
break;
}
}
fclose(fp); //ファイルクローズ
return 0;
}
int txtread(void)
{
FILE *fp; //ファイルポインタ
errno_t err; //ファイルエラー
char kensaku[16]; //検索用文字列
char namae[16]; //氏名
int eigo; //英語
char kokugo[4]; //性別
char suugaku[64]; //数学
int recno; //レコード件数カウンタ
int findno; //合致したレコード件数
char work[8]; //入力用作業領域
err=fopen_s(&fp,FILENAME,"r"); //読み込みモードでオープン
if(err != 0) //ファイルオープンに成功したかチェック
{
perror("ファイルオープンに失敗しました");
return -1;
}
printf("検索する氏名?:");
gets_s(kensaku,15);
recno = 0; //変数の初期化
findno = 0; //変数の初期化
for(;;)
{
fseek(fp,RECORDLENGTH * recno++,SEEK_SET);
if(fscanf_s(fp,"%s",namae,15)==EOF) //ファイルの終わりの時
{
break;
}
//対象データの検索および表示
if(strstr(namae,kensaku) !=NULL)
{
findno++;
printf("------------------------------\n"); //データの区切り
fscanf_s(fp,"%d",&eigo);
fscanf_s(fp,"%s",kokugo,3);
fscanf_s(fp,"%s",suugaku,63);
printf("氏名:%s\n",namae);
printf("英語:%d\n",eigo);
printf("国語:%s\n",kokugo);
printf("数学:%s\n",suugaku);
printf("------------------------------\n"); //データの区切り
printf("検索を続けますか?(Y or N):");
gets_s(work,7);
if(work[0] == 'y'||work [0] == 'Y')
{
continue;
}
else
{
break;
}
}
}
printf("%d件見つかりました。\n",findno);
fclose(fp); //ファイルクローズ
return 0;
}
int txtcorrect(void)
{
FILE *fp; //ファイルポインタ
errno_t err; //ファイルエラー
char shusei[16]; //検索用文字列
char namae[16]; //氏名
int eigo; //英語
char kokugo[4]; //国語
char suugaku[64]; //数学
int recno; //レコード件数カウンタ
int findno; //合致したレコード件数
char work[8]; //入力作業領域
err = fopen_s(&fp,FILENAME,"r+"); //読み込み更新モードでオープン
if(err != 0) //ファイルオープンに成功したかチェック
{
perror("ファイルオープンに失敗しました。");
return -1;
}
printf("修正する氏名?:");
gets_s(shusei,15);
recno = 0; //変数の初期化
findno = 0; //変数の初期化
for(;;)
{
fseek(fp,RECORDLENGTH * recno++,SEEK_SET);
if(fscanf_s(fp,"%s",namae,15)== EOF); //ファイルの終わりの時
{
break;
}
//対象データの検索および表示
if(strstr(namae,shusei) != NULL)
{
findno = 1;
printf("----------------------------\n"); //データの区切り
fscanf_s(fp,"%d",&eigo);
fscanf_s(fp,"%s",kokugo,3);
fscanf_s(fp,"%s",suugaku,63);
printf("氏名:%s\n",namae);
printf("英語:%d\n",eigo);
printf("国語:%s\n",kokugo);
printf("数学:%s\n,suugaku");
printf("----------------------------\n"); //データの区切り
printf("このデータを修正しますか?(Y or N):");
gets_s(work,7);
if(work[0] == 'y'|| work[0] == 'Y');
{
printf("氏名を修正しますか?(Y or N):");
gets_s(work,7);
if(work[0] == 'y'|| work[0] == 'Y')
{
printf("氏名:");
gets_s(namae,15);
}
printf("英語を修正しますか?(Y or N):");
gets_s(work,7);
if(work[0] == 'y' || work[0] == 'Y')
{
printf("英語:");
gets_s(work,7);
eigo = atoi(work);
}
printf("国語を修正しますか?(Y or N):");
gets_s(work,7);
if(work[0] == 'y' || work[0] == 'Y')
{
printf("国語:");
gets_s(kokugo,3);
}
printf("数学を修正しますか?(Y or N):");
gets_s(work,7);
if(work[0] == 'y' || work[0] == 'Y')
{
printf("数学:");
gets_s(suugaku,63);
}
fseek(fp,RECORDLENGTH * (recno - 1),SEEK_SET);
fprintf(fp,recformat,namae,eigo,kokugo,suugaku);
}
}
}
if(findno == 0) //対象のデータが見つからなかった場合
{
printf("修正データはありませんでした。\n");
}
fclose(fp); //ファイルクローズ
return 0;
}