構造体のファイル書き込み&読み出しに関して2
C言語を勉強しているものです。指定した番号に構造体を書き込み、指定した番号をの構造体を出力するプログラムを作成したいのですが、表示結果画像のようになってしまいます。
デバックしても、どこが違うのかがわかりません。説明不足かとは思いますがご教授お願いします。
↓↓ソースコード↓↓
#include<stdio.h>
#include<stdlib.h>
struct S_data{
char Name[10+1];/*名前*/
int Sex;/*性別*/
int Height;/*身長*/
float Weight;/*体重*/
};
void FR_data(FILE *Fp,int pos);
void FW_data(FILE *Fp,int pos);
void OUP_data(struct S_data tag);
void INP_data(struct S_data *tag);
int RF_data(FILE *Fp,struct S_data *tag,int pos);
int WF_data(FILE *Fp,struct S_data *tag,int pos);
void main(){
FILE *Fp;
int pos=0;
int Ret;
Fp=fopen("aaa.dat","r+b");
if(Fp==NULL){
Fp=fopen("aaa.dat","w+b");
if(Fp==NULL){
printf("File not open\n");
exit(2);
}
}
while(1){
printf("入力の番号[0:終了]->");
scanf("%d",&pos);
if(pos==0) break;
FW_data(Fp,pos);
}
while(1){
printf("出力の番号[0:終了]->");
scanf("%d",&pos);
if(pos==0) break;
FR_data(Fp,pos);
}
Ret=fclose(Fp);
}
void FR_data(FILE *Fp,int pos){
struct S_data Temp; /*出力情報*/
int Ret; /*返却値*/
memset(&Temp,'\0',sizeof(Temp));
Ret=RF_data(Fp,&Temp,pos); /*情報の読み込み*/
if (Ret!=1){
printf("File not read\n");
}else{
OUP_data(Temp); /*情報の表示*/
}
}
void FW_data(FILE *Fp,int pos){
struct S_data wk; /*入力情報*/
int Ret; /*返却値*/
memset(&wk,'\0',sizeof(wk));
INP_data(&wk); /*情報の入力*/
Ret=WF_data(Fp,&wk,pos); /*情報の書き込み*/
if (Ret!=1){
printf("File not write\n");
}
}
void OUP_data(struct S_data tag){
printf("Name:%s\n",tag.Name);
if (tag.Sex==0){
printf("Sex:M\n");
}else{
printf("Sex:F\n");
}
printf("Height:%d\n",tag.Height);
printf("Weight:%.2f\n",tag.Weight);
}
void INP_data(struct S_data *tag){
memset(tag,'\0',sizeof(tag));
printf("Name-->");
scanf("%s",&tag->Name);
printf("Sex[0:M1:F]-->");
scanf("%d",&tag->Sex);
printf("Height-->");
scanf("%d",&tag->Height);
printf("Weight-->");
scanf("%f",&tag->Weight);
}
int RF_data(FILE *Fp,struct S_data *tag,int pos){
int Ret_I; /*fseek返却値*/
size_t Ret_S; /*fread返却値*/
Ret_I=fseek(Fp,sizeof(tag)*(pos),SEEK_SET);
Ret_S=fread(tag,sizeof(tag),1,Fp);
return Ret_S;
}
int WF_data(FILE *Fp,struct S_data *tag,int pos){
int Ret_I; /*fseek返却値*/
size_t Ret_S; /*fwrite返却値*/
Ret_I=fseek(Fp,sizeof(tag)*(pos),SEEK_SET);
Ret_S=fwrite(tag,sizeof(tag),1,Fp);
return Ret_S;
}
お礼
わかりやすい説明ありがとうございました もう一度ポインタや構造体を勉強したいと思います。