修正プログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
eagle

修正プログラム

#1

投稿記事 by eagle » 14年前

・以前ここで質問させていただいたのですが、コメント1つ入れずにお願いしてしまい
 大変失礼しました。
・未だフォーラムルールをよく理解していないため、行番号などが表示されないかも
 しれませんがお許しくださると助かります。




・このプログラムで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;
}

non
記事: 1097
登録日時: 15年前

Re: 修正プログラム

#2

投稿記事 by non » 14年前

全体の仕様がわからないのですが。特にデータをどう持つのかについて。

見た感じでは、データはオンメモリで全件を持つのではなく、必要なデータをファイルから読むという
考え方でよいのですね?
だとすると、将来レコードの削除はどうしますか?それとも、削除することはない?

ところで、なぜ、英語はintで、数学と国語は文字列なのですか?
non

eagle

Re: 修正プログラム

#3

投稿記事 by eagle » 14年前

・理想としては
  氏名     英語     国語      数学
  ○○      67      89       99
  ☓☓     77      56       78
  ▲▲     43      22       33
 こんな感じにしたいです。

・削除機能も欲しかったのですが、リスト表示に苦戦してたので考えていませんでした。
 今回は削除機能は無しでお願いします。

・intと文字列を使って組み合わせてるのは特に意味が無いです、、、、、
 失礼しました。

non
記事: 1097
登録日時: 15年前

Re: 修正プログラム

#4

投稿記事 by non » 14年前

まず、4が使えるように、メニューやswitchを作ってください。

次に、4が押された時の関数として、
txtreadをまるのままコピーして別名にしましょう。

別名にしたtxtreadから検索の部分やifの判定を削除しましょう。
だいたいの形になると思います。
non

閉鎖

“C言語何でも質問掲示板” へ戻る