0

テキストファイルを C プログラムにリダイレクトしています。

./test.c < earthquakes.txt

次のように scanf で必要なデータを読み込みます。

while (scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f",
    &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki,
    &latit, &longi, &depth, &magnitude) == 13) {
    printf("test\n");
    num_earthquakes++;
}

必要な行をすべて読むまで。それを行った後、標準入力の先頭に戻るにはどうすればよいですか?

4

3 に答える 3

1

おそらく、1 つのパスを作成するのが最良のオプションです。値を読み取り、realloc必要に応じて を使用して配列のサイズを変更します。膨大な量の入力によるエラーの可能性を最小限に抑えるには、問題を解決するために必要な情報のみを保存する必要があります。出力が月に基づく場合は、月に基づいて情報を収集します。例えば:

size_t count = 0;
struct month_stat *month = NULL;
while (count <= SIZE_MAX / sizeof *month &&
       scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f",
             &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki,
             &latit, &longi, &depth, &magnitude) == 13)
{
    /* resize based upon powers of two for simplicity */
    if (count & (count - 1) == 0)
    {
        void *temp = realloc(month, (count * 2 + 1) * sizeof *month);
        if (temp == NULL)
        {
            /* handle error */
        }

        month = temp;
    }

    /* TODO: Update month[count] and overall stats
     *       When the month changes, you'll want to count++;
     */
}

*と の間に a を配置することで入力を破棄するように scanf に指示できることをご存知%ですか? たとえば、assert(scanf("%*c") == 0);割り当てなしで文字を読み取って破棄すると、戻り値に反映されます。

于 2013-04-21T17:00:59.397 に答える
0

考えられる方法は、最初の講義中に、記憶の表現を構築することです。たとえば、各行に対応する連結リストを作成すると、要素は独自の構造体になります。

そうすれば、一度読むだけで、興味深く便利な使い方ができます。

于 2013-04-21T15:16:06.353 に答える