アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

根本的にqsortを使うには、そのテキストファイルの全てがメモリー上に配置されなければなりません。

入れ替えするのですから。
従って配列sを一次元で確保してますが二次元にする(或いは全て一括でfreadしてポインター配列を別途確保するか)事が必要です。
まず全部をメモリーに読んで表示出来てからqsortに進みましょう。
    • good
    • 0

 文字列じゃなきゃだめ?

この回答への補足

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

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

補足日時:2008/05/16 12:36
    • good
    • 0

★アドバイス


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

この回答への補足

#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
    • good
    • 0

>fprintf(fout, "%d\n", data);


配列のdataがこれで出ます?
    • good
    • 1

★アドバイス


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

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

お礼日時:2008/05/16 15:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!