前提・実現したいこと
円の中心位置と半径を3セット入力し、半径の大きい順にソートしたものをバイナリに保存するプログラムと、保存されたバイナリを読み込んで中心位置が原点から近い順にソートして表示するプログラムを作りたいです。
発生している問題・エラーメッセージ
ファイルを読み込んで表示するときに、①で入力した値とは違うものが表示されてしまいます。
テキストファイルに保存したとき(fprintf,fscanfを使ったとき)は問題が起こらなかったので、fwriteやfreadの引数が間違っているのかなと思います。
該当のソースコード
①ファイルを保存するプログラム
C
1#include <stdio.h> 2#include <math.h> 3struct circle 4{ 5 double x; 6 double y; 7 double rad; 8}; 9void swap(double *px,double *py) 10{ 11 double tmp=*px; 12 *px=*py; 13 *py=tmp; 14} 15int main(void) 16{ 17 int i,j; 18 double num[3]={1,2,3}; 19 struct circle n[3]; 20 char str[50]; 21 FILE *fp; 22 23 puts("3つの円の座標と半径を入力"); 24 for(i=0;i<3;i++) 25 { 26 printf("円%.0f\n",num[i]); 27 printf("座標x="); scanf("%lf",&n[i].x); 28 printf("座標y="); scanf("%lf",&n[i].y); 29 printf("半径r="); scanf("%lf",&n[i].rad); 30 } 31 puts("半径の大きい順にソート\n"); 32 for(i=0;i<3;i++) 33 { 34 for(j=i+1;j<3;j++) 35 { 36 if(n[i].rad<n[j].rad) 37 { 38 swap(&num[i],&num[j]); 39 swap(&n[i].x,&n[j].x); 40 swap(&n[i].y,&n[j].y); 41 swap(&n[i].rad,&n[j].rad); 42 } 43 } 44 } 45 for(i=0;i<3;i++) 46 printf("円%.0f:(%.2f,%.2f),r=%.2f\n",num[i],n[i].x,n[i].y,n[i].rad); 47 48 //ファイルに出力 49 printf("ファイル名を入力:"); scanf("%s",str); 50 fp=fopen(str,"wb"); 51 if(fp==NULL) 52 printf("ファイル%sをオープンできませんでした。\n",str); 53 else 54 { 55 printf("半径および中心位置を保存しました。\n"); 56 fwrite(n,sizeof(n),3,fp); 57 fclose(fp); 58 } 59 return 0; 60} 61
②ファイルを読み込んで表示するプログラム
C
1#include <stdio.h> 2#include <math.h> 3struct circle 4{ 5 double x; 6 double y; 7 double rad; 8 double len; 9}; 10void len_p(double x,double y,double *len) 11{ 12 *len=sqrt(pow(x,2)+pow(y,2)); 13} 14void swap(double *px,double *py) 15{ 16 double tmp=*px; 17 *px=*py; 18 *py=tmp; 19} 20int main(void) 21{ 22 int i,j; 23 struct circle n[3]; 24 char str[50]; 25 FILE *fp; 26 27 printf("ファイル名を入力:"); scanf("%s",str); 28 if((fp=fopen(str,"rb"))==NULL) 29 printf("ファイル%sをオープンできませんでした。\n",str); 30 else 31 { 32 fread(n,sizeof(n),3,fp); 33 for(i=0;i<3;i++) 34 { 35 printf("(%.2f,%.2f),r=%.2f\n",n[i].x,n[i].y,n[i].rad); 36 len_p(n[i].x,n[i].y,&n[i].len); 37 } 38 puts("中心位置が原点から近い順にソート"); 39 for(i=0;i<3;i++) 40 { 41 for(j=i+1;j<3;j++) 42 { 43 if(n[i].len>n[j].len) 44 { 45 swap(&n[i].x,&n[j].x); 46 swap(&n[i].y,&n[j].y); 47 swap(&n[i].rad,&n[j].rad); 48 swap(&n[i].len,&n[j].len); 49 } 50 } 51 } 52 for(i=0;i<3;i++) 53 printf("(%.2f,%.2f),r=%.2f,距離%.2f\n",n[i].x,n[i].y,n[i].rad,n[i].len); 54 fclose(fp); 55 } 56 return 0; 57} 58
補足情報(FW/ツールのバージョンなど)
開発環境はwindows10のMinGWです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。