質問 |
||
| QNo.4026075 | 昇順ソート | |
|---|---|---|
| 質問者:x_rider2 |
sort.txtから読み込んだ値を 昇順でソートして出力するにはどうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int strcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; int length; char s[256], s2[256]; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s, 256, fin) != NULL) { /* 要素数を求める */ length = sizeof(s) / 256; /* 昇順でソート */ qsort(s, length, 256, strcmp_asc); /* memset(s2, NULL, sizeof(s2)); for (i = 0; i < length; i++) { } */ fprintf(fout,"%s\n",s2); } fclose(fin); fclose(fout); return 0; } int strcmp_asc(const void *sa, const void *sb) { return strcmp((char *)sa, (char *)sb); } sort.txt 50 45 35 25 15 10 5 1 32 46 8 7 9 19 18 14 16 13 12 17 11 20 40 30 31 3 2 37 38 36 33 39 34 49 47 48 4 6 44 42 43 41 21 22 26 24 28 29 27 23 |
|
困り度:
|
||
| 質問投稿日時: 08/05/16 10:46 |
||
回答 |
|
| ANo.5 | ★アドバイス >これではうまくいきませんでした。 >初心者なので、どこがダメなのかよくわかりません。 >アドバイスをお願いします。 ↑ 配列をちゃんと理解していませんね。 間違っている箇所は >fprintf(fout, "%d\n", data); の表示部分だけです。 ここさえ直せば動くでしょう。 テキスト(教本)で『配列とは』を読み直して下さい。 特に配列の内容をprintf()関数などで表示する方法を探す。 ・簡単すぎるので勘を働かせて下さい。 試行錯誤すれば初心者でも身につきます。 |
|---|---|
| 回答者:Oh-Orange | |
| 種類:アドバイス どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/05/16 15:24 |
|
| |
| この回答へのお礼 | ありがとうございました。 皆さんのおかげで解決しました。 とても助かりました。 |
回答 |
|
| ANo.4 | >fprintf(fout, "%d\n", data); 配列のdataがこれで出ます? |
|---|---|
| 回答者:yokomaya | |
| 種類:アドバイス どんな人:一般人 自信:自信あり |
|
| 回答日時: 08/05/16 15:11 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答20pt |
|
| ANo.3 | ★アドバイス >sort.txtから読み込んだ値を >昇順でソートして出力するにはどうしたらよいでしょうか? 読み込み部分が正しくないありませんね。 ファイルに数値のみしかないならfscanf()関数を使って すべてを配列に代入してからソートすれば良いでしょう。 ・下にサンプルを載せておきます。 サンプル: int data[ 10000 ]; ←ちょっと多めに宣言 int max; // fscanfで読み込み for ( max = 0 ; max < 10000 ; max++ ){ if ( fscanf(fin,"%d\n",&data[max]) != 1 ){ break; } } // ここでソート qsort( data, max, sizeof(int), strcmp_value ); 注意事項: ・比較関数の strcmp_value は作り直して下さい。 作り方分かりますよね。 ポイントは整数値の比較ですよ。 |
|---|---|
| 回答者:Oh-Orange | |
| 種類:回答 どんな人:専門家 自信:参考意見 |
|
| 回答日時: 08/05/16 13:42 |
|
| |
| この回答への補足 | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int numcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; char s[256]; int data[10000]; int max; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } for(max = 0; max < 10000; max++){ if(fscanf(fin, "%d\n", &data[max]) != 1){ break; } } qsort(data, max, sizeof(int), numcmp_asc); fprintf(fout, "%d\n", data); fclose(fin); fclose(fout); return 0; } /** * 数値を昇順で比較します。 * @param na 比較する数値 * @param nb 比較する数値 * @return na が nb と等しい場合は 0 、 * na が nb より小さい場合は -1 以下、 * na が nb より大きい場合は 1 以上 */ int numcmp_asc(const void *na, const void *nb) { return *(int *)na - *(int *)nb; } これではうまくいきませんでした。 初心者なので、どこがダメなのかよくわかりません。 アドバイスをお願いします。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.2 | 文字列じゃなきゃだめ? |
|---|---|
| 回答者:yaemon_2006 | |
| 種類:補足要求 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/16 12:13 |
|
| |
| この回答への補足 | >文字列じゃなきゃだめ? sort.txtの数値を昇順でソートできれば別にかまいません。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | 根本的にqsortを使うには、そのテキストファイルの全てがメモリー上に配置されなければなりません。入れ替えするのですから。 従って配列sを一次元で確保してますが二次元にする(或いは全て一括でfreadしてポインター配列を別途確保するか)事が必要です。 まず全部をメモリーに読んで表示出来てからqsortに進みましょう。 |
|---|---|
| 回答者:yokomaya | |
| 種類:回答 どんな人:一般人 自信:自信あり |
|
| 回答日時: 08/05/16 11:29 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |