• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:昇順ソート)

昇順ソートの方法とは?

このQ&Aのポイント
  • sort.txtから読み込んだ値を昇順でソートして出力するにはどうしたらよいでしょうか?
  • C言語のプログラムを使用して、sort.txtから値を読み込み、昇順でソートして出力する方法を教えてください。
  • sort.txtに書かれた値を昇順でソートして出力するためのC言語のプログラムを作成したいです。具体的な手順を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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 は作り直して下さい。  作り方分かりますよね。  ポイントは整数値の比較ですよ。

x_rider2
質問者

補足

#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; } これではうまくいきませんでした。 初心者なので、どこがダメなのかよくわかりません。 アドバイスをお願いします。

その他の回答 (4)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★アドバイス >これではうまくいきませんでした。 >初心者なので、どこがダメなのかよくわかりません。 >アドバイスをお願いします。  ↑  配列をちゃんと理解していませんね。  間違っている箇所は >fprintf(fout, "%d\n", data);  の表示部分だけです。  ここさえ直せば動くでしょう。  テキスト(教本)で『配列とは』を読み直して下さい。  特に配列の内容をprintf()関数などで表示する方法を探す。 ・簡単すぎるので勘を働かせて下さい。  試行錯誤すれば初心者でも身につきます。

x_rider2
質問者

お礼

ありがとうございました。 皆さんのおかげで解決しました。 とても助かりました。

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.4

>fprintf(fout, "%d\n", data); 配列のdataがこれで出ます?

回答No.2

 文字列じゃなきゃだめ?

x_rider2
質問者

補足

>文字列じゃなきゃだめ? sort.txtの数値を昇順でソートできれば別にかまいません。

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.1

根本的にqsortを使うには、そのテキストファイルの全てがメモリー上に配置されなければなりません。入れ替えするのですから。 従って配列sを一次元で確保してますが二次元にする(或いは全て一括でfreadしてポインター配列を別途確保するか)事が必要です。 まず全部をメモリーに読んで表示出来てからqsortに進みましょう。