C言語関係掲示板

過去ログ

No.1215 ファイルのデータを行単位でランダムに並べ替える

[戻る] [ホームページ]
No.16025

ファイルのデータを行単位でランダムに並べ替える
投稿者---むぎ(2004/07/31 18:36:56)


題名の通り、ファイルのデータ行単位でランダムに並べ替えたいのですが、
うまくいきません。
ファイルの中には、適当な短い英文が辞書順に並んでいます。

よろしくお願いします。
環境は、Unixです。




No.16027

Re:ファイルのデータを行単位でランダムに並べ替える
投稿者---円零(2004/07/31 20:13:13)


>題名の通り、ファイルのデータ行単位でランダムに並べ替えたいのですが、
>うまくいきません。
>ファイルの中には、適当な短い英文が辞書順に並んでいます。
>
>よろしくお願いします。
>環境は、Unixです。
>
それだけの情報じゃあどこが間違ってるのか我々にはわからないのでアドバイスのしようがないです。

しょうがないのでタロットで占ってみましょう。
…ええと、「世界」の逆位置。
わかった!これはきっと一行読み出しができないに違いありません。
ファイルから一行読むにはfgetsが使えますよ。
末尾が改行文字じゃない時は行の途中で切っている可能性があるので注意!

私の占いが外れている場合はまた書き込んでください。


No.16028

Re:ファイルのデータを行単位でランダムに並べ替える
投稿者---aki(2004/07/31 20:55:44)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void random_shuffle_copy(char *random[], char *sorted[], int n)
{
    int i = 0;

    while (n > 0) {
        int r = rand() % n;
        random[i++] = sorted[r];
        sorted[r] = sorted[--n];
    }
}

int read(char *sorted[])
{
    char sentence[1024];  int i = 0;

    while (gets(sentence)) {
        sorted[i] = malloc(strlen(sentence) + 1);
        if (sorted[i] == 0)
            fprintf(stderr, "メモリが確保できませんでした"), exit(1);
        strcpy(sorted[i++], sentence);
    }
    return i;
}

#define SENTENCE_MAX 10000

int main(void)
{
    char *sorted[SENTENCE_MAX], *random[SENTENCE_MAX];
    int num;

    num = read(sorted);
    random_shuffle_copy(random, sorted, num);
    return 0;
}



No.16177

ようやく出力させることが出来ました^ー^
投稿者---むぎ(2004/08/14 17:01:04)


お礼が遅くなって申し訳ありません。
理解して出力させるのに時間がかかりました。
自分の能力のなさに落ち込んでもしょうがないので
もっと勉強します。

有り難う御座いました。

機械がありましたらまたご教授ください。