こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

昇順ソート

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;
inti;
intlength;
chars[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

投稿日時 - 2008-05-16 10:46:16

QNo.4026075

すぐに回答ほしいです

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

★アドバイス
>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 は作り直して下さい。
 作り方分かりますよね。
 ポイントは整数値の比較ですよ。

投稿日時 - 2008-05-16 13:42:12

補足

#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;
inti;
chars[256];
intdata[10000];
intmax;

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;
}

これではうまくいきませんでした。
初心者なので、どこがダメなのかよくわかりません。
アドバイスをお願いします。

投稿日時 - 2008-05-16 14:38:12

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

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

投稿日時 - 2008-05-16 15:24:36

お礼

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

投稿日時 - 2008-05-16 15:47:32

ANo.4

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

投稿日時 - 2008-05-16 15:11:28

ANo.2

 文字列じゃなきゃだめ?

投稿日時 - 2008-05-16 12:13:02

補足

>文字列じゃなきゃだめ?

sort.txtの数値を昇順でソートできれば別にかまいません。

投稿日時 - 2008-05-16 12:36:53

ANo.1

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

投稿日時 - 2008-05-16 11:29:27

あなたにオススメの質問