fscanf関数について

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

fscanf関数について

#1

投稿記事 by yoko » 17年前

以下のプログラムなのですが、ファイルからデータが読み込めません。
デバッグを行った結果、関数read_dataの最初のfscanf関数でfscanf.cの52行めのstream != NULLというところでエラーが発生しているようです。どこを直せばよいのでしょうか。プログラムが長いので、複数回に分けて投稿します。
コンパイラ Microsoft Visual Studio 2005
OS Windows XP

プログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define ERROR -1

/*構造体定義*/
struct student{
    char name[100];
	int student_number;
	char password[100];
    int score[3][5];
};
struct teacher{
	char name[100];
	int teacher_number;
	char password[100];
	int subject_id;
};

/*プロトタイプ宣言*/
void ninsho(struct student* data,struct teacher* data1,int b,int* student,int* teacher,int* ninsho);
void student_score(struct student* data,int student_number,int b);
void teacher_score(struct student* data,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[/url]);
void teacher_topx(struct student* data_copy,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[/url]);
void sort(struct student* data,int left,int right,int subject,int b,int jiki);
void teacher_menu(struct student* data,struct teacher* data1,int teacher_number,int b);
void teacher_logout(struct student* data,struct teacher* data1,int teacher_number,int b);
void read_data(struct student* data,struct teacher* data1,int b);
void student_logout(struct student* data,int student_number,int b);
void student_menu(struct student* data,int student_number,int b);
void student_topx(struct student* data_copy,int student_number,int b);
void file_out(struct student* data,int b,int subject,int hyoji,char* subject_name,int* juni,double average_score,double* deviation_score,int jiki);
void entry(struct student* data,struct teacher* data1,int b,int subject,int teachre_number);

int main(void)
{
    int b,student_number=1,teacher_number,ninsho1=ERROR;
	struct student data[31];
	struct teacher data1[3];
	b=sizeof(data)/sizeof(data[0]);
	
	read_data(data,data1,b);

	/*認証*/
	ninsho(data,data1,b,&student_number,&teacher_number,&ninsho1);

	
	if(ninsho1==0){
		student_menu(data,student_number,b); /*学生の場合*/
	}else if(ninsho1==1){
		teacher_menu(data,data1,teacher_number,b);
	}
    return 0;
}

/*認証関数*/
void ninsho(struct student* data,struct teacher* data1,int b,int* student,int* teacher,int* ninsho){
	int i,number;
	char dmy[100],name[100],pass[100];
	printf("氏名と番号とパスワードを入力してください。\n");
	printf("氏名:");
	fgets(name,sizeof(name),stdin);
	name[strlen(name)-1]='\0';
	printf("番号:");
	fgets(dmy,sizeof(dmy),stdin);
	number=atoi(dmy);
	printf("パスワード:");
	fgets(pass,sizeof(pass),stdin);
	pass[strlen(pass)-1]='\0';
	for(i=0;i<b;i++){
		if(strcmp(name,data.name)==0&&
		   number==data.student_number&&
		   strcmp(pass,data.password)==0){
			*ninsho=0;
			*student=number;
			break;
		}
	}
	if(*ninsho!=0){
		for(i=0;i<3;i++){
			if(strcmp(name,data1.name)==0&&
			   number==data1.teacher_number&&
			   strcmp(pass,data1.password)==0){
				*ninsho=1;
				*teacher=number;
				break;
			}
		}
	}
	printf("\n");
	if(*ninsho==ERROR){
		printf("認証失敗\n\n");
		exit(0);
	}else{
		printf("認証成功\n\n");
	}
}

yoko

Re:fscanf関数について

#2

投稿記事 by yoko » 17年前

プログラム続き
void student_score(struct student* data,int student_number,int b){
	int jiki=1,i,j,sum1_score[3]={0},score_total[31]={0},sum1_total=0;
	double sum2_score[3]={0.0},sum2_total=0.0;
	double average_score[3],average_total;
	double standard_score[3],standard_total;
	double deviation_score[3],deviation_total;
	char test_name[100],dmy[100];

	printf("成績を見たい時期の番号を入力してください。\n1:1学期中間\n2:1学期期末\n3:2学期中間"
			"\n4:2学期期末\n5:3学期学年末\n");
	do{
		printf("番号?");
		if(jiki!=1){
			printf("1~5以外の番号が入力されました。\n");
			exit(0);
		}
		fgets(dmy,sizeof(dmy),stdin);
		jiki=atoi(dmy);
	}while(jiki<1||jiki>5);
	for(i=0;i<b;i++){
		for(j=0;j<3;j++){
			score_total+=data.score[j][jiki-1];
			sum1_score[j]+=data.score[j][jiki-1];
		}
		sum1_total+=score_total;
	}

	/*平均点*/
	for(i=0;i<3;i++){
	average_score=(double)sum1_score/b;
	}
	average_total=(double)sum1_total/b;

	for(i=0;i<b;i++){
		for(j=0;j<3;j++){
		sum2_score[j]+=pow((double)(data.score[j][jiki-1]-average_score[j]),2.0);
		}
		sum2_total+=pow((double)(score_total-average_total),2.0);
	}

	/*標準偏差*/
	for(i=0;i<3;i++){
	standard_score=sqrt((double)(sum2_score/b));
	}
	standard_total=sqrt((double)(sum2_total/b));

	/*学力偏差値*/
	for(i=0;i<3;i++){
		deviation_score[i]=(10.0*((double)(data[student_number-1].score[i][jiki-1]-average_score[i])/standard_score[i])+50.0);
	}
	deviation_total=(10.0*((double)(score_total[student_number-1]-average_total)/standard_total)+50.0);

	switch(jiki){
		case 1:
			strcpy(test_name,"1学期中間");
			break;
		case 2:
			strcpy(test_name,"1学期期末");
			break;
		case 3:
			strcpy(test_name,"2学期中間");
			break;
		case 4:
			strcpy(test_name,"2学期期末");
			break;
		case 5:
			strcpy(test_name,"3学期学年末");
			break;
	}

	/*個人成績表示*/
	printf("\n%sさんの%sの各科目の点数と平均点と偏差値は\n",data[student_number-1].name,test_name);
	printf("総合 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n",score_total[student_number-1],average_total,deviation_total);
	printf("数学 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n",data[student_number-1].score[0][jiki-1],average_score[0],deviation_score[0]);
	printf("国語 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n",data[student_number-1].score[1][jiki-1],average_score[1],deviation_score[1]);
	printf("英語 得点:%3d 平均点:%4.5f 偏差値:%2.5f\n\n",data[student_number-1].score[2][jiki-1],average_score[2],deviation_score[2]);

	student_logout(data,student_number,b);
}

void teacher_score(struct student* data,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[/url]){
	int i,j,sum1_score[5]={0},score[31][5],student_number=1;
	double sum2_score[5]={0};
	double average_score[5],standard_score[5],deviation_score[5];
	char dmy[100];
	
	printf("\n成績を見たい学生の番号を入力してください。\n");
	do{
		if(student_number!=1){
			printf("その番号の学生は存在しません。\n");
			exit(0);
		}
		printf("番号?");
		fgets(dmy,sizeof(dmy),stdin);
		student_number=atoi(dmy);
	}while(student_number<1||student_number>b);

	switch(subject){
		case 1:
			for(i=0;i<b;i++){
				for(j=0;j<5;j++){
					score[i][j]=data[i].score[0][j];
				}
			}
			break;
		case 2:
			for(i=0;i<b;i++){
				for(j=0;j<5;j++){
					score[i][j]=data[i].score[1][j];
				}
			}
			break;
		case 3:
			for(i=0;i<b;i++){
				for(j=0;j<5;j++){
					score[i][j]=data[i].score[2][j];
				}
			}
			break;
	}

	for(i=0;i<b;i++){
		for(j=0;j<5;j++){
			sum1_score[j]+=score[i][j];
		}
	}

	/*平均点*/
	for(i=0;i<5;i++){
		average_score[i]=(double)sum1_score[i]/b;
	}
	
	for(i=0;i<b;i++){
		for(j=0;j<5;j++){
			sum2_score[j]+=pow((double)(score[i][j]-average_score[j]),2.0);
		}
		
	}

	/*標準偏差*/
	for(i=0;i<5;i++){
		standard_score[i]=sqrt((double)(sum2_score[i]/b));
	}
	
	/*学力偏差値*/
	for(i=0;i<5;i++){
		deviation_score[i]=(10.0*((double)(score[student_number-1][i]-average_score[i])/standard_score[i])+50.0);
	}
	
	printf("%sさんの%sの点数と平均点と偏差値は\n",data[student_number-1].name,subject_name);
	printf("1学期中間   得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][0],average_score[0],deviation_score[0]);
	printf("1学期期末   得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][1],average_score[1],deviation_score[1]);
	printf("2学期中間   得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][2],average_score[2],deviation_score[2]);
	printf("2学期期末   得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][3],average_score[3],deviation_score[3]);
	printf("3学期学年末 得点:%d 平均点:%f 偏差値:%f\n",score[student_number-1][4],average_score[4],deviation_score[4]);
	printf("\n");

	teacher_logout(data,data1,teacher_number,b);
}

yoko

Re:fscanf関数について

#3

投稿記事 by yoko » 17年前

続き
void teacher_topx(struct student* data_copy,struct teacher* data1,int teacher_number,int b,int subject,char subject_name[/url]){
	int i,sum1_score=0,jiki=1,hyoji=1,juni[31],fileout;
	double sum2_score=0.0;
	double average_score,standard_score,deviation_score[31];
	char dmy[100];
	struct student data[31];

	for(i=0;i<b;i++){
		data=data_copy;
	}
	
	printf("1:1学期中間\n2:1学期期末\n3:2学期中間\n4:2学期期末\n5:3学期学年末\n");
	do{
		printf("番号?");
		if(jiki!=1){
				printf("1~5以外の番号が入力されました。\n");
				exit(0);
		}
		fgets(dmy,sizeof(dmy),stdin);
		jiki=atoi(dmy);
	}while(jiki<1||jiki>5);
	printf("表示人数を入力してください。\n");
	do{
		printf("人数?");
		if(hyoji!=1){
				printf("間違った人数が入力されました。\n");
				exit(0);
		}
		fgets(dmy,sizeof(dmy),stdin);
		hyoji=atoi(dmy);
	}while(hyoji<1||hyoji>b);

	sort(data,0,b-1,subject,b,jiki);

	for(i=0;i<b;i++){
		sum1_score+=data.score[subject-1][jiki-1];
	}

	average_score=(double)(sum1_score/b);

	for(i=0;i<b;i++){
		sum2_score+=pow((double)(data.score[subject-1][jiki-1]-average_score),2.0);
	}

	for(i=0;i<b;i++){
		standard_score=sqrt((double)(sum2_score/b));
	}

	for(i=0;i<b;i++){
		deviation_score=(10.0*((double)data.score[subject-1][jiki-1]-average_score)/standard_score)+50.0;
	}

	/*順位付け*/
	for(i=0;i<hyoji;i++){
			if(i==0){
			juni=i+1;
		}else{
			if(data.score[subject-1][jiki-1]==data[i-1].score[subject-1][jiki-1]){
				juni=juni[i-1];
			}else{
				juni=i+1;
			}
		}
	}

	/*成績トップ表示*/
	printf("\n\t%s成績トップ%d\n",subject_name,hyoji);
	for(i=0;i<hyoji;i++){
		printf("%2d位\t%10s\t得点:%3d\t平均点:%2.5f\t偏差値:%2.5f\n"
			,juni[i],data[i].name,data[i].score[subject-1][jiki-1]
			,average_score,deviation_score[i]);
	}
	printf("ファイル出力しますか?(1:YES,2:NO)\n");
	printf("番号?");
	fgets(dmy,sizeof(dmy),stdin);
	fileout=atoi(dmy);
	if(fileout!=1&&fileout!=2){
		printf("1か2以外の番号が入力されました。\n");
		exit(0);
	}
	if(fileout==1){
		file_out(data_copy,b,subject,hyoji,subject_name,juni,average_score,deviation_score,jiki);
	}

	teacher_logout(data_copy,data1,teacher_number,b);
}

void sort(struct student* data,int left,int right,int subject,int b,int jiki){
	int pl=left,pr=right,x;
	struct student temp;

	x=data[(pl+pr)/2].score[subject-1][jiki-1];

	do{
		while(data[p[/url].score[subject-1][jiki-1]>x){
			pl++;
		}
		while(data[p[/url].score[subject-1][jiki-1]<x){
			pr--;
		}
		if(pl<=pr){
		temp=data[p[/url];
		data[p[/url]=data[p[/url];
		data[p[/url]=temp;
		pl++;
		pr--;
		}
	}while(pl<=pr);

	if(left<pr){
		sort(data,left,pr,subject,b,jiki);
	}
	if(pl<right){
		sort(data,pl,right,subject,b,jiki);
	}
}

void teacher_menu(struct student* data,struct teacher* data1,int teacher_number,int b){
	int menu,subject;
	char dmy[100],subject_name[100];

	printf("担当教科番号を入力してください。\n");
	printf("番号?");
	fgets(dmy,sizeof(dmy),stdin);
	subject=atoi(dmy);
	if(subject!=data1[teacher_number-1].subject_id){
		printf("担当教科番号が違います。\n");
		exit(0);
	}
	
	switch(subject){
		case 1:
			strcpy(subject_name,"数学");
			break;
		case 2:
			strcpy(subject_name,"国語");
			break;
		case 3:
			strcpy(subject_name,"英語");
			break;
	}
	printf("\n教員メニュー\n");
	printf("1.%s成績トップ表示\n2.個人成績表示\n3.成績更新\n4.ログアウト\n",subject_name);
	printf("番号?");
	fgets(dmy,sizeof(dmy),stdin);
	menu=atoi(dmy);
	if(menu<1||menu>4){
		printf("1~4以外の番号が入力されました。");
		exit(0);
	}
	printf("\n");
	switch(menu){
		case 1:
			teacher_topx(data,data1,teacher_number,b,subject,subject_name);
			break;
		case 2:
			teacher_score(data,data1,teacher_number,b,subject,subject_name);
			break;
		case 3:
			entry(data,data1,b,subject,teacher_number);
			break;
		case 4:
			teacher_logout(data,data1,teacher_number,b);
			break;
	}
}

void teacher_logout(struct student* data,struct teacher* data1,int teacher_number,int b){
	int menu,program,ninsho1=ERROR;
	char dmy[100];
	printf("\n教員メニュー終了しますか?(1:YES,2:NO)\n");
	printf("番号?");
	fgets(dmy,sizeof(dmy),stdin);
	menu=atoi(dmy);
	if(menu!=1&&menu!=2){
		printf("1か2以外の番号が入力されました。\n");
		exit(0);
	}
	if(menu==2){
		teacher_menu(data,data1,teacher_number,b);
	}else{
		printf("\nプログラムを終了しますか?(1:YES,2:NO)\n");
		printf("番号?");
		fgets(dmy,sizeof(dmy),stdin);
		program=atoi(dmy);
		if(program!=1&&program!=2){
			printf("1か2以外の番号が入力されました。\n");
			exit(0);
		}
		if(program==2){
			printf("\n");
			main();
		}else{
			exit(0);
		}
	}
}

yoko

Re:fscanf関数について

#4

投稿記事 by yoko » 17年前

続き
void read_data(struct student* data,struct teacher* data1,int b){
	int i,j,k;
	FILE *file;
	if(file=fopen("score.txt","r")==NULL){
		printf("ファイルが存在しません。\n");
		exit(0);
	}else{
		/*データ値代入*/
		/*学生*/
		for(i=0;i<b;i++){
			fscanf(file,"%s%d%s",&data.name,&data.student_number,&data.password);
			for(k=0;k<3;k++){
				for(j=0;j<5;j++){
					fscanf(file,"%d",&data.score[k][j]);
				}
			}
		}
		/*教師*/
		for(i=0;i<3;i++){
			fscanf(file,"%s%d%s%d",&data1.name,&data1.teacher_number,&data1.password,&data1.subject_id);
		}
		fclose(file);
	}
}

void student_menu(struct student* data,int student_number,int b){
	int menu;
	char dmy[100];
	
	
	printf("\n学生メニュー\n");
	printf("1.自学年成績トップ表示\n2.個人成績表示\n3.ログアウト\n");
	printf("番号?");
	fgets(dmy,sizeof(dmy),stdin);
	menu=atoi(dmy);
	if(menu<1||menu>3){
		printf("1~3以外の番号が入力されました。");
		exit(0);
	}
	printf("\n");
	switch(menu){
		case 1:
			student_topx(data,student_number,b);
			break;
		case 2:
			student_score(data,student_number,b);
			break;
		case 3:
			student_logout(data,student_number,b);
			break;
	}
}

void student_logout(struct student* data,int student_number,int b){
	int menu,program,ninsho1=ERROR;
	char dmy[100];
	printf("\n学生メニュー終了しますか?(1:YES,2:NO)\n");
	printf("番号?");
	fgets(dmy,sizeof(dmy),stdin);
	menu=atoi(dmy);
	if(menu!=1&&menu!=2){
		printf("1か2以外の番号が入力されました。\n");
		exit(0);
	}
	if(menu==2){
		student_menu(data,student_number,b);
	}else{
		printf("\nプログラムを終了しますか?(1:YES,2:NO)\n");
		printf("番号?");
		fgets(dmy,sizeof(dmy),stdin);
		program=atoi(dmy);
		if(program!=1&&program!=2){
			printf("1か2以外の番号が入力されました。\n");
			exit(0);
		}
		if(program==2){
			printf("\n");
			main();
		}else{
			exit(0);
		}
	}
}

void student_topx(struct student* data_copy,int student_number,int b){
	int i,sum1_score=0,jiki=1,hyoji=1,juni[31],subject=1;
	double sum2_score=0.0;
	double average_score,standard_score,deviation_score[31];
	char dmy[100],subject_name[100];
	struct student data[31];

	for(i=0;i<b;i++){
		data=data_copy;
	}
	
	printf("1:1学期中間\n2:1学期期末\n3:2学期中間\n4:2学期期末\n5:3学期学年末\n");
	do{
		printf("番号?");
		if(jiki!=1){
				printf("1~5以外の番号が入力されました。\n");
				exit(0);
		}
		fgets(dmy,sizeof(dmy),stdin);
		jiki=atoi(dmy);
	}while(jiki<1||jiki>5);
	printf("見たい教科の番号を入力してください。\n");
	printf("1:数学\n2:国語\n3:英語");
	do{
		printf("番号?");
		if(subject!=1){
			printf("1~3以外の数字が入力されました。\n");
			exit(0);
		}
		fgets(dmy,sizeof(dmy),stdin);
		subject=atoi(dmy);
	}while(subject<1||subject>3);

	switch(subject){
		case 1:
			strcpy(subject_name,"数学");
			break;
		case 2:
			strcpy(subject_name,"国語");
			break;
		case 3:
			strcpy(subject_name,"英語");
			break;
	}

	printf("表示人数を入力してください。\n");
	do{
		printf("人数?");
		if(hyoji!=1){
				printf("間違った人数が入力されました。\n");
				exit(0);
		}
		fgets(dmy,sizeof(dmy),stdin);
		hyoji=atoi(dmy);
	}while(hyoji<1||hyoji>b);

	sort(data,0,b-1,subject,b,jiki);

	for(i=0;i<b;i++){
		sum1_score+=data[i].score[subject-1][jiki-1];
	}

	average_score=(double)(sum1_score/b);

	for(i=0;i<b;i++){
		sum2_score+=pow((double)(data[i].score[subject-1][jiki-1]-average_score),2.0);
	}

	for(i=0;i<b;i++){
		standard_score=sqrt((double)(sum2_score/b));
	}

	for(i=0;i<b;i++){
		deviation_score[i]=(10.0*((double)data[i].score[subject-1][jiki-1]-average_score)/standard_score)+50.0;
	}

	/*順位付け*/
	for(i=0;i<hyoji;i++){
			if(i==0){
			juni[i]=i+1;
		}else{
			if(data[i].score[subject-1][jiki-1]==data[i-1].score[subject-1][jiki-1]){
				juni[i]=juni[i-1];
			}else{
				juni[i]=i+1;
			}
		}
	}

	/*成績トップ表示*/
	printf("\n\t%s成績トップ%d\n",subject_name,hyoji);
	for(i=0;i<hyoji;i++){
		printf("%2d位\t%d\t%10s\t得点:%3d\t平均点:%2.5f\t偏差値:%2.5f\n"
			,juni[i],data[i].student_number,data[i].name,data[i].score[subject-1][jiki-1]
			,average_score,deviation_score[i]);
	}
	
	
	student_logout(data,student_number,b);
}

yoko

Re:fscanf関数について

#5

投稿記事 by yoko » 17年前

続き
void file_out(struct student* data,int b,int subject,int hyoji,char* subject_name,int* juni,double average_score,double* deviation_score,int jiki){
	int i;
	char file_name[100];
	FILE *file;
	printf("ファイル名?");
	fgets(file_name,sizeof(file_name),stdin);
	file_name[strlen(file_name)-1]='\0';
	file=fopen(file_name,"w");
	fprintf(file,"%s成績トップ%d\n\n",subject_name,hyoji);
	for(i=0;i<hyoji;i++){
		fprintf(file,"\t%2d位\t%d\t%10s\t得点:%3d\t平均点:%2.5f\t偏差値:%2.5f\n"
			,juni,data.student_number,data.name,data.score[subject-1][jiki-1]
			,average_score,deviation_score);
	}
	fclose(file);
}

void entry(struct student* data,struct teacher* data1,int b,int subject,int teacher_number){
	int i,j,k,jiki=1,student_number=1,score=0,number=1;
	char dmy[100];
	FILE *file;
	file=fopen("score.txt","w");
	printf("更新したいテストの時期を入力してください。\n");
	printf("1:1学期中間\n2:1学期期末\n3:2学期中間\n4:2学期期末\n5:3学期学年末\n");
	do{
		printf("番号?");
		if(jiki!=1){
				printf("1~5以外の番号が入力されました。\n");
				exit(0);
		}
		fgets(dmy,sizeof(dmy),stdin);
		jiki=atoi(dmy);
	}while(jiki<1||jiki>5);
	fgets(dmy,sizeof(dmy),stdin);
	jiki=atoi(dmy);
	printf("更新したい学生の番号を入力してください。\n");
	do{
		if(student_number!=1){
			printf("その番号の学生は存在しません。\n");
			exit(0);
		}
		printf("番号?");
		fgets(dmy,sizeof(dmy),stdin);
		student_number=atoi(dmy);
	}while(student_number<1||student_number>b);
	do{
		printf("更新する得点を入力してください。\n");
		do{
			if(score!=0){
				printf("間違った点数が入力されました。\n");
				exit(0);
			}
			printf("得点?");
			fgets(dmy,sizeof(dmy),stdin);
			score=atoi(dmy);
		}while(score<0||score>100);
		printf("更新する得点は%dでいいですか?(1:YES,2:NO)\n",score);
		printf("番号?");
		fgets(dmy,sizeof(dmy),stdin);
		number=atoi(dmy);
		if(number!=1&&number!=2){
			printf("1か2以外の番号が入力されました。\n");
			exit(0);
		}
	}while(number==2);
	
	data[student_number-1].score[subject-1][jiki]=score;
	
	/*データ値代入*/
	/*学生*/
	for(i=0;i<b;i++){
		fprintf(file,"%s\t%d\t%s\t",data.name,data.student_number,data.password);
		for(k=0;k<3;k++){
			for(j=0;j<5;j++){
				fprintf(file,"%d",data.score[k][j]);
				if(j!=4){
					fprintf(file,"\t");
				}else{
					fprintf(file,"\n");
				}
			}
		}
	}
	/*教師*/
	for(i=0;i<3;i++){
		fprintf(file,"%s\t%d\t%s\t%d\n",data1.name,data1[i].teacher_number,data1[i].password,data1[i].subject_id);
	}
	printf("更新終了\n\n");
	
	fclose(file);

	teacher_logout(data,data1,teacher_number,b);
}

Re:fscanf関数について

#6

投稿記事 by » 17年前

>関数read_dataの最初のfscanf関数でfscanf.cの52行めのstream != NULL…
こう書くのであれば、とりあえず関数ひとつだけあげて、ほかはファイル後とあげてしまったほうがこちらもやりやすいかと、、、

>52行めのstream != NULL
これ、どこ???

>fscanf(file,"%s%d%s",&data.name,&data.student_number,&data.password);
"%s%d%s" これってしてよかったっけ?
多分うまく読み取れないはず、、、
後、区切りっていらなかったっけ?スペースか[,] どっちか

どの関数を追加した時点で問題が起こった?

Justy

Re:fscanf関数について

#7

投稿記事 by Justy » 17年前

>関数read_dataの最初のfscanf関数でfscanf.cの52行めの
 そこまで特定できてるなら、後はその周辺を見れば何か判るというモノ。
[color=#d0d0ff" face="monospace]if(file=fopen("score.txt","r")==NULL)[/color]
 この if文では fopenに成功したかどうかの判定がおかしく、
変数 fileに fopenの戻り値が入りません。

 で、不正な fileをもって fscanfをしようとすれば当然何かしらのエラーになるというもの。
 演算子の優先順位を思い出して、直してみて下さい。




>これ、どこ???
 多分 CRT(fscanf)の中でしょう。

box

Re:fscanf関数について

#8

投稿記事 by box » 17年前

>>fscanf(file,"%s%d%s",&data.name,&data.student_number,&data.password);
>"%s%d%s" これってしてよかったっけ?

入力ファイルの中の各フィールドを
空白文字で区切っていれば、問題ありません。

たかぎ

Re:fscanf関数について

#9

投稿記事 by たかぎ » 17年前

> if(file=fopen("score.txt","r")==NULL){

この部分の解釈は意外に難しいので、念のため解説しておきます。

1. fopen("score.txt","r") が評価される。このときの返却値を仮に A とする。
2. A==NULL が評価される。1.で fopen が成功していれば 0 に、そうでなければ 1 になる。これを仮に B とする。
3. file=B が評価される。B は int 型であるが、暗黙的に FILE* に型変換される。B が 1 のとき式全体も 1 になる。
4. 3.の評価結果が 1 であれば if の条件は真となる。

yoko

Re:fscanf関数について

#10

投稿記事 by yoko » 17年前

if(file=fopen("score.txt","r")==NULL){

if((file=fopen("score.txt","r"))==NULL){
としたらエラーなく動きました。
ありがとうございました。

閉鎖

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