FILE構造体のfread使用について

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

FILE構造体のfread使用について

#1

投稿記事 by MK-22 » 14年前

課題です
fread,fwriteを使用して.binで読み込み書き出しをしているのですが、この状態で一度表示させるとcharなら「フフフフフフ...ソリッド」やintなら「-86475536」など
キチンと表示されません。charは[%-14s]などで試してみましたが変わらずでした。
fread,fwriteの使い方はこれで正しく使われているでしょうか?
また、表示させようとしているchar nameはソース内で書いた構造体か一度書き込んだ.binのどちらなのか判別はできるのでしょうか
よろしくお願いします

コード:

#define _CRT_SECURE_NO_WARNINGS
#include  <windows.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <conio.h>
#include  <time.h>

typedef struct{
	char name[10];
	int life;
	int MP;
	int att;
	int defe;
}TEKI;

typedef struct{
	char *iname;
	short X;
	short Y;
}ITEM;

typedef struct{
	char *mp;
	short x;
	short y;
}MAP;

int main(void)
{
	TEKI date[20]={
		{"ソリッド    ",100,100, 90, 80},
		{"リキッド    ",100,100, 70, 80},
		{"ソリダス    ",100,100, 80, 80},
		{"レイヴン    ", 80,100,100, 30},
		{"ミラー      ",100,100, 50, 50},
		{"メリル      ", 70, 40, 60, 60},
		{"オセロット    ",100,100, 50, 50},
		{"ジョニー    ", 80, 30, 60, 30},
		{"ピューパ   ", 80,  0, 80, 70},
		{"ヴァンプ   ", 80,  0, 80, 40},
		{"オタコン     ", 85,100, 45, 80},
		{"ゼロ      ",100,100, 80, 40},
		{"シギント    ",100,100, 30, 80},
		{"パラメディック",100,100, 60, 60},
		{"ソロー      ",100,100, 70, 70},
		{"ペイン     ",100,100, 70, 60},
		{"フィアー     ",100,100, 70, 80},
		{"オクトパス   ",100,  0, 50, 90},
		{"マンティス    ",100, 80, 70, 70},
		{"ビッグ.ボス",100,100, 90, 90},
	},*OFF,*DEF,MC[2],teki;

	ITEM	item[]={
		{"名前   ",16,5},
		{"LIFE   ",16,7},
		{"MP     ",16,9},
		{"攻撃力",16,11},
		{"防御力",16,13},
	};

	MAP	map[4]={
		{"+―――――――――――――――――――――――+",14,4},
		{"|                                                      |",14,5},
		{"+―――――――――――――――――――――――+",14,14},
	};

	HANDLE  hStdout;
    COORD   pos;

	FILE	*fp_txt,*fp_bin;
	int i,n,damage,rnd,wk,sen,kou,rand_hai[20];
	int no,btl;
	int ban=1;
	int flg=0;

	/*-------書き込み-------*/

	//テキスト
	fp_txt=fopen("monster.txt","w");
	if(fp_txt==NULL){return -1;}

	for(i=0;i<20;i++){
	fprintf(fp_txt,"%s %3d %3d %3d %3d\n",date[i].name,date[i].life,date[i].MP,date[i].att,date[i].defe);
	}

	//バイナリ
	fp_bin=fopen("monster.bin","wb");
	if(fp_bin==NULL){return -1;}

             fwrite(&teki,sizeof(TEKI),1,fp_bin);

	fclose(fp_txt);
	fclose(fp_bin);
	/*----------------------*/

	fp_bin=fopen("monster.bin","rb");
	if(fp_bin==NULL){return -1;}

	fread(&teki,sizeof(TEKI),1,fp_bin);

	srand((unsigned)time(NULL));

	for(i=0;i<20;i++)	rand_hai[i]=i;
	for(i=20;i>1;i--){
		rnd=rand()%i;
		wk=rand_hai[i-1];
		rand_hai[i-1]=rand_hai[rnd];
		rand_hai[rnd]=wk;
	}
	sen=rand_hai[0];
	kou=rand_hai[1];

	MC[0]=date[sen];
	MC[1]=date[kou];

	hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

	SetConsoleTextAttribute(hStdout,BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
	pos.X=14;
	pos.Y=3;
	SetConsoleCursorPosition(hStdout, pos);
	printf("戦闘データ");
	SetConsoleTextAttribute(hStdout,FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); 

	/*--------枠組み--------*/
	pos.X=map[0].x;
	pos.Y=map[0].y;
	SetConsoleCursorPosition(hStdout, pos);
	printf("%s",map[0].mp);

	pos.Y=map[1].y;
	for(i=0;i<9;i++){
		SetConsoleCursorPosition(hStdout, pos);
		printf("%s",map[1].mp);
		pos.Y++;
	}

	pos.Y=map[2].y;
	SetConsoleCursorPosition(hStdout, pos);
	printf("%s",map[2].mp);
	/*----------------------*/


	ban^=0x00000001;
	OFF=&MC[ban];
	DEF=&MC[ban^0x00000001];

//問題の部分
	for(i=0;i<5;i++){
		pos.X=50;
		pos.Y=5;
		SetConsoleCursorPosition(hStdout, pos);
		printf("[%s]",teki.name);
		_getch();
	}
	
	SetConsoleTextAttribute(hStdout,FOREGROUND_RED);
	pos.X=16;
	pos.Y=16;
    SetConsoleCursorPosition(hStdout, pos);
	printf("*** 処理終了です ***");
	_getch();
	SetConsoleTextAttribute(hStdout,FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);  // 文字色を復帰
	pos.X=0;
	pos.Y=24;
    SetConsoleCursorPosition(hStdout, pos);
		fclose(fp_txt);
	fclose(fp_bin);

	return 0;

}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: FILE構造体のfread使用について

#2

投稿記事 by softya(ソフト屋) » 14年前

読み書きでサイズや構造体の扱いがかなりでたらめです。
date(data?)の20個の要素をファイルに書き出したいなら、
fwrite(&date,sizeof(date),1,fp_bin);
なのですが、更に読み込み部分がtekiだと先頭の1個の構造体要素しか読み出せません。
それで良いのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
沖 滉均
記事: 237
登録日時: 14年前
住所: K県F市

Re: FILE構造体のfread使用について

#3

投稿記事 by 沖 滉均 » 14年前

tekiは定義しているだけで初期化や値を入れていないのは気づいていますか?
つまり下記で行っているのは不定値を書き込んでいるだけです。

とりあえず以下の2点まず確認してみると良いかも
1.先頭でTEKI teki;という定義があるのみで中身は不定値
2.fwriteやfreadでsizeof(TEKI)と書いているが、これではTEKI型の構造体1つ分のサイズしか取れない

fread,fwriteの使い方という問題ではないかと
There is no royal road to learning.
codeタグで指定できる言語
画像

MK-22

Re: FILE構造体のfread使用について

#4

投稿記事 by MK-22 » 14年前

freadの使う場所を変えてみるとできました
正しいのかは分かりませんが一先ずはこれで進行していき、授業のある日に先生に確認してもらってみます
ありがとうございました

閉鎖

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