ページ 11

修正プログラム

Posted: 2011年9月01日(木) 20:40
by eagle
  
    このプログラムに
    ・入力したデータの各項目の修正
    ・入力したデータの一覧表示
    を追加したいのですがどうしてもうまくいきません、、、
    間違いを教えてください!!



#define FILENAME "seiseki.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;
}
}
return 0;
}

int menu(void)
{
char retno[8];

for(;;)
{
printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
printf("データの新規・追加書き込みを行う->1\n");
printf("データの読み込みを行う----------->2\n");
printf("データの修正を行う--------------->3\n");
printf("終了----------------------->0\n");
printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
printf("番号を入力してください--->");
gets_s(retno,7);


retno[1] = '\0';
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];
char eigo[3];
char kokugo[3];
char suugaku[3];

char work[8];


err = fopen_s(&fp,FILENAME,"a");
if(err != 0)
{
perror("ファイルオープンに失敗しました。");
return -1;
}

for(;;)
{
printf("氏名:");
gets_s(namae,1);
printf("英語:");
gets_s(eigo,7);
printf("国語:");
gets_s(kokugo,3);
printf("数学:");
gets_s(suugaku,63);

if(fprintf(fp,recformat,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];
char eigo[3];
char kokugo[3];
char suugaku[3];

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)==EOF)
{
break;
}

if(strstr(namae,kensaku) !=NULL)
{
findno++;
printf("-----------------\n");
fscanf_s(fp,"%d",&eigo);
fscanf_s(fp,"%s.3",kokugo);
fscanf_s(fp,"%s.65",suugaku);
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];
char eigo[3];
char kokugo[3];
char suugaku[3];

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.3",kokugo);
fscanf_s(fp,"%s.65",suugaku);
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(eigo,7);

}
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;
}

Re: 修正プログラム

Posted: 2011年9月01日(木) 22:42
by box
コメントが全くなく、そこかしこにマジックナンバーが埋め込んであるコードを読み解いて、
修正箇所をお伝えするのはひじょうにきびしいものがあると思います。

Re: 修正プログラム

Posted: 2011年9月01日(木) 23:51
by softya(ソフト屋)
フォーラムルールをお読みになってテンプレートとcodeタグを使ってくださると助かります。
http://dixq.net/board/board.html

コード:

	#define FILENAME "seiseki.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;
			}
		}
		return 0;
	}

	int menu(void)
	{
		char retno[8];

		for(;;)
		{
			printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
			printf("データの新規・追加書き込みを行う->1\n");
			printf("データの読み込みを行う----------->2\n");
			printf("データの修正を行う--------------->3\n");
			printf("終了----------------------->0\n");
			printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
			printf("番号を入力してください--->");
			gets_s(retno,7);


			retno[1] = '\0';
			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];
		char eigo[3];
		char kokugo[3];
		char suugaku[3];

		char work[8];


		err = fopen_s(&fp,FILENAME,"a");
		if(err != 0)
		{
			perror("ファイルオープンに失敗しました。");
			return -1;
		}

		for(;;)
		{
			printf("氏名:");
			gets_s(namae,1);
			printf("英語:");
			gets_s(eigo,7);
			printf("国語:");
			gets_s(kokugo,3);
			printf("数学:");
			gets_s(suugaku,63);

			if(fprintf(fp,recformat,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];
		char eigo[3];
		char kokugo[3];
		char suugaku[3];

		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)==EOF)
			{
				break;
			}

			if(strstr(namae,kensaku) !=NULL)
			{
				findno++;
				printf("-----------------\n");
				fscanf_s(fp,"%d",&eigo);
				fscanf_s(fp,"%s.3",kokugo);
				fscanf_s(fp,"%s.65",suugaku);
				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];
		char eigo[3];
		char kokugo[3];
		char suugaku[3];

		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.3",kokugo);
			fscanf_s(fp,"%s.65",suugaku);
			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(eigo,7);
				
				}
				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;
}

Re: 修正プログラム

Posted: 2011年9月02日(金) 00:01
by softya(ソフト屋)
現状の機能の説明と今の問題点を詳細に書いてもらえますか?
あと、その改造中のポイントも行番号あたりで説明したらったほうが良いと思います。

ちなみに添付したもらったプログラムはミスがあってコンパイルが通りません。一箇所だけですけどね。