質問: 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 $ */ ```
回答: こんにちは。この質問の続きですね。 どうも配列についてご存知ない様子ですね。下記ページで調査されると良いと思います。 配列の使い方 構造体の配列 > > 3.編集欄の上の方に並んでいるB I A ◯ □ '' >の>を押してみてください。「ここに言語を入力」のところにC++、「コード」のところにプログラムをコピーアンドペーストすればOKです。 > > > 惜しいです。>を押して表示される`'''ここに言語を入力`と`'''`の間に文章ではなくプログラムを入れて下さい。 【追記】 fread(lst, sizeof(best_ten), NDATA, fp); で纏めて読めば良いと思いますよ。 【1/20 10時の質問修正への回答です】 色々触りすぎているようです。 とりあえず回答です。1/18最後のバージョンから下記2点のみ修正してます。(main関数内の先頭4行です。) 0.lst配列の初期化を止め、10個データがあることが分かっているので10個固定で領域を確保しました。 0.lst配列へのデータ読み込みを追加しました。 LACKNUM.DATのフォーマットに変更がないなら、読めるはずです。 ``` // best_ten型 // この各要素を指すポインタの配列を用意して、「best順」に qsort します。 // cmpptr 関数の内容 // return (*(best_ten**)p)->id - (*(best_ten**)q)->id; //仮引数の p と q に渡されるのは、ポインタ配列 plst の配列要素を指すポインタです。 //plst の配列要素の型は ronbun_t* ですから、p と q の型は ronbun_t** であり、 //比較するメンバは (**(ronbun_t**)p).id です。 // これを (*(ronbun_t**)p)->id と書いています。 #include #include #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; // --------------- 比較用の関数 cmp ------------------- int cmpptr( const void *p, const void *q ) { return (*(best_ten**)p)->best - (*(best_ten**)q)->best; } // ---------------------------------------------------- int main() { best_ten lst[10]; FILE *fp = fopen("LACKNUM.DAT", "rb"); fread(lst, sizeof(best_ten), NDATA, fp); fclose(fp); int i; best_ten *plst[NDATA]; // ポインタの配列 plst に構造体配列のアドレスを代入 // lst[0]のアドレスをplst[0]に代入する。順次NDATA個代入する。 // lst[0]の{2015,10,27,19, 9,59,11.0}の先頭アドレスがplst[0]に代入される。 for( i = 0; i < NDATA; i++ ) plst[i] = &lst[i]; // best順にソート // ポインタ配列plst[]の先頭アドレスがplst qsort( plst, NDATA, sizeof(best_ten*), cmpptr ); // 並べ替え後の内容を表示 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); } ``` エラー処理は手を抜いていますので、入れてみてください。 またデータ数は10個固定にしてしまってます。可変長にするのは結構難しいですので、もし可変長に対応されるのでしたら、次の課題とすることをお薦めします。 なお、本日のソースについてはnob.さんの回答を参考にされて下さい。