1

したがって、読み取りと書き込みを使用してstdinからファイルから行を読み取り、並べ替えてから、書き込みを使用してstdoutに書き出すという割り当てがあります。しかし、私はそれを動作させることができません。

再出力する前に、まずbufでsort関数を呼び出して、文字列(readを使用して取得したもの)を並べ替える必要があります。bufを配列として扱うことはできますか?それともそのようには機能しませんか?その理由は、最初に文字列をソートする必要があるためです。

int record_compare(const void *a, const void *b)
{
  return (memcmp(a, b, num_bytes));
}
 qsort(buf, num_elements, num_bytes, record_compare);
 while (count < n - num_bytes)
 {
   i = memcmp(buf+count, buf+count + num_bytes, num_bytes);
   if (i == 0)
     count = count + num_bytes;
   else
   {
     for (k = 0; k < num_bytes; k++)
     {
   printf("%c", buf[count]);
   count++;
     }
   }     
 }

しかし、fgetsのようなものの代わりにreadで文字列を取得したので、bufを配列として扱うことはできますか?これは、ソートが通常の配列でどのように機能するかです(ソートしてから、繰り返しなしで出力します。

 do {
     c = read(0, buf+n, 1);
     if (c != 0)
        n++;
   }
 while (c != 0);

これが私がbufを得た方法です。

4

1 に答える 1

2

システム コールはread()N バイトを読み取ります (コードを記述した方法で一度に 1 バイト)。改行を取得するか、0 バイトが返される (EOF をマークする) まで、またはエラーが発生するまで、読み上げたいと思うでしょう。改行を見つけたと仮定すると、新しいバッファを開始します。

おそらく文字ポインタの配列があり、おそらく各行に新しい文字列を割り当て、そのポインタを文字ポインタの配列に格納します。

enum { MAX_LINES = 1024 };
char *lines[MAX_LINES];
int n_lines = 0;

固定の上限で問題ないと思います。ポインターの配列を動的に割り当てるように手配することもできます。

そのため、行を読み取って保存する関数が必要になります。

次に、比較機能に問題があります。次のように呼び出します。

qsort(lines, n_lines, sizeof(char *), record_compare);

ただし、 record_compare()2 つの値が与えられるchar **ため、次を使用する必要があります。

int record_compare(const void *v1, const void *v2)
{
    const char *s1 = *(char **)v1;
    const char *s2 = *(char **)v2;
    return(strcmp(s1, s2));
}

ソートされたデータの書き込みは非常に簡単です。そのため、ラインリーダー機能に集中する必要があります。

于 2012-05-23T04:47:46.680 に答える