コード ```もともとのデータが char dtfile[]="LACKNUM.DAT"に入っています。時間、年,月、日、時、分、秒、best秒で入っています。これをbest秒の小さい順に並べ変えたいのですが、なかなかうまくできないので、構造体best_ten lst[]に直接自分で別の表示法で調べて、打ち込んでやってみたらとりあえず、並べ替えはできました。この構造体best_ten lst[]にchar dtfile[]="LACKNUM.DAT"からうまく移し変えれば、目的を達成できるのですが、教えてください。 main関数の差し替えをして、lstにはすでに"LACKNUM.DAT"が入った状態です。これを実行するとエラー(plst[i] = &lst[i];で)が出るのですが解決法をおねがいします。 いろいろやりましたが解決できないのでよろしくお願いします。 ```//【 構造体のポインタ配列を qsort するプログラム例 】 #include <float.h> //追加 #include <time.h> #include <stdio.h> #include <stdlib.h> #define NDATA ((sizeof lst)/(sizeof(best_ten))) typedef struct { int tm_year; int tm_mon; int tm_mday; int tm_hour; int tm_min; int tm_sec; double best; }best_ten; char dtfile[] = "LACKNUM.DAT"; // --------------- 比較用の関数 cmp ------------------- int cmpptr( const void *p, const void *q ) { return (*(best_ten**)p)->best - (*(best_ten**)q)->best; } // ---------------------------------------------------- int main() { FILE *fp,*lstfp; double best; int count=0; int i,j; best_ten lst[count]; best_ten *plst[count]; if ((fp = fopen(dtfile, "rb")) == NULL) { printf("ファイルを作成します。\n\n"); best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ } else { struct tm local; double line[256]; printf("\n過去の履歴\n-------------------------- \n"); while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n", local.tm_year + 1900, local.tm_mon + 1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec); fread(&best, sizeof(double),1, fp); printf("得点(所要時間)は%.1f秒\n\n",best); if ((lstfp = fopen(lst, "wb")) == NULL) { //ここから printf("ファイルを作成します。\n\n"); best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ } else { fwrite(&local,sizeof(struct tm), 1, lstfp); fwrite(&best,sizeof(double), 1, lstfp); } //ここまで追加 count++; } } printf("countは%d \n\n",count); printf("\n過去の履歴のコピー\n-------------------------- \n"); while((i = fread(&lst, sizeof( best_ten), 1, lstfp)) > 0 ){ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n", lst[i].tm_year + 1900, lst[i].tm_mon + 1, lst[i].tm_mday, lst[i].tm_hour, lst[i].tm_min, lst[i].tm_sec); fread(&best, sizeof(double), 1, lstfp); printf("得点(所要時間)は %.1f秒です。\n\n", best); //plst[i] = &lst[i]; } // ポインタの配列 plst に構造体配列のアドレスを代入 // lst[0]のアドレスをplst[0]に代入する。順次NDATA個代入する。 // lst[0]の{2015,10,27,19, 9,59,11.0}の先頭アドレスがplst[0]に代入される。 // best順にソート // ポインタ配列plst[]の先頭アドレスがplst //qsort( plst, NDATA, sizeof(best_ten*), cmpptr ); // 並べ替え後の内容を表示 printf("\n並べ替え後の過去の履歴のベストテン\n-------------------------- \n"); // 並べ替え後の内容を表示 printf( "年, 月, 日,時,分,秒,\n" ); /*for( i = 0; i < NDATA; i++ ){ printf( "%4d年 %2d月 %2d日 %2d時 %2d分 %2d秒%.lf秒\n" , plst[i]->tm_year, plst[i]->tm_mon, plst[i]->tm_mday, plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec ,plst[i]->best); } // 画面が一瞬で消えてしまうのを防止 // 一瞬で画面が消えてしまう場合には、以下の文を入力します。*/ fflush(stdin); getchar(); fclose(fp); fclose(lstfp); return 0; } /*実行結果 ...@naka ~/quick $ gcc -o quick8d quick8d.c -lpdcursesw quick8b.c: In function `main': quick8b.c:66: warning: passing arg 1 of `fopen' from incom patible pointer type ...@naka ~/quick $ quick8d 過去の履歴 -------------------------- 2015年 10月 27日 19時 9分 59秒 得点(所要時間)は11.0秒 ファイルを作成します。 2016年 1月 4日 19時 15分 11秒 得点(所要時間)は8.0秒 ファイルを作成します。 2016年 1月 4日 19時 16分 8秒 得点(所要時間)は9.0秒 ファイルを作成します。 2016年 1月 4日 19時 16分 39秒 得点(所要時間)は10.0秒 ファイルを作成します。 2016年 1月 4日 19時 19分 7秒 得点(所要時間)は10.0秒 ファイルを作成します。 2016年 1月 4日 19時 21分 11秒 得点(所要時間)は10.0秒 ファイルを作成します。 2016年 1月 4日 19時 21分 44秒 得点(所要時間)は8.0秒 ファイルを作成します。 2016年 1月 4日 19時 22分 55秒 得点(所要時間)は13.0秒 ファイルを作成します。 2016年 1月 5日 21時 31分 52秒 得点(所要時間)は12.0秒 ファイルを作成します。 2016年 1月 5日 21時 33分 29秒 得点(所要時間)は10.0秒 ファイルを作成します。 countは10 過去の履歴のコピー -------------------------- ...@naka ~/quick $ */
LACKNUM.DAT はどんなフォーマットで保存されているのですか?
>>この構造体best_ten lst[]にchar dtfile[]="LACKNUM.DAT"からうまく移し変えれば、目的を達成できるのですが、教えてください。
ファイル読み込みに失敗しているということですか?
読み込みに失敗しているのなら、どのように失敗しているのか(構造体の要素がばらばらに入っている、ファイルを読めていない、データがあふれている)などがあると回答しやすいです。
●best_ten lst[] に入っていてほしいデータ
●best_ten lst[] に今(エラー発生時点)入っているデータ
を調べるとどう直すべきかが見えてくるかもしれません。
回答3件
あなたの回答
tips
プレビュー