|
> データの件数は決まっていません。MAXも不明です。
> データの件数は決まっていません。MAXも不明です。
> 読み込むデータ量がわからないので、自動変数や、動的にエリアを確保しても、
> オーバーフローが発生しました。
オーバーフローが発生したときのデータ量は何メガバイトでしたか。
コンパイラは何ですか。LSI C-86 ?
OS は何ですか。MS-DOS ?
> 読み込む量がわからないので、構造体確保してソートするのはちょっと無理でした。
なぜ、構造体がいるんでしょうか。単に、行をソートするだけでいけないのですか。
> 別の方法を考えてやってみます。
例えば、こんなプログラムではいかがでしょうか。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
int main(int argc, char **argv)
{
FILE *fp;
char buf[1024], **line = NULL;
int size = 1024, n, i;
if (argc != 2) return printf("usage: %s file\n", argv[0]), 1;
fp = fopen(argv[1], "r+");
if (fp == NULL) return printf("can't open %s\n", argv[1]), 1;
for (n = 0; fgets(buf, sizeof buf, fp); n++) {
if (line == NULL || n >= size) {
line = realloc(line, size *= 2);
if (line == NULL) return puts("out of memory"), 1;
}
line[n] = strdup(buf);
if (line[n] == NULL) return puts("out of memory"), 1;
}
qsort(line, n, sizeof *line, compare);
rewind(fp);
for (i = 0; i < n; i++)
fputs(line[i], fp);
fclose(fp);
return 0;
}
|