0

簡単な質問ですが、次の3つの操作を実行する方法はありますか。

while(...) {
fscanf(input, "%lf %lf", &t, &y);
tTotal += t;
yTotal += y;
}

scanfステートメント内でtとyがそれぞれtArrayとyArrayに追加される1つの操作で?形の何か

fscanf(input, "%lf %lf", ...code..., ...code...); 

ありがとう、アッシュ。

4

6 に答える 6

2

これを行うにはfscanf()、結果を格納する場所に加えて、必要な操作を知る必要があります (変数がまだ初期化されていない場合は未定義になります)。

それを行うためにラッパーを書くこともできfscanf()ますが、それは非常に特定のユースケースでは大変な作業であり、最終的に += を実行するよりも遅くなります。

于 2010-01-10T23:00:02.907 に答える
2

それは不可能。fscanfスキャンした値をポインターで指定されたメモリ位置に書き込むだけで、その操作で加算を実行する方法はありません。

于 2010-01-10T23:00:45.807 に答える
2

fscanf はポインターを受け入れ、その場所に書き込むだけなので、fscanf 関数のパラメーターに追加する方法はありません。ただし、次のように同じステートメントの追加部分を作成することもできます。

while(...) {
    fscanf(input, "%lf %lf", &t, &s), tTotal += t, sTotal += s;
}

このステートメントの結果は、最後の式の値であることに注意してください。たとえば、scanf の戻り値を記録したい場合は、次のようにします。

while(...) {
    int res;
    useResult((res = fscanf(input, "%lf %lf", &t, &s), tTotal += t, sTotal += s, res));
}

...これは醜いですが機能します。

(免責事項: このコードはコンパイルしていません)

于 2010-01-10T23:12:28.930 に答える
1

救助へのポインタ演算!

while(fscanf(input, "%lf %lf", t, y)) {t++; y++;}

どこで、最初に配列の先頭ty指します。

もちろん、独自の境界チェックを追加する必要があります。

于 2010-01-10T22:53:09.643 に答える
0

C ++では、これはかなり簡単ですが、Cでは(せいぜい)かなり難しい可能性があります。

于 2010-01-10T22:50:15.767 に答える
0

問題は、何を達成しようとしているのかということです。
混乱を減らしたい場合は、次のようなインライン関数を作成します。

int GetData(FILE *fp, double *ptTotal, double *pyTotal)
{
    double t, y;
    if (2 == fscanf(fp, "%lf %lf", &t, &y))
    {
         *ptTotal += t;
         *pyTotal += y;
         return 1;
    }
    else
    {
        return 0;
    }
}

それをループで呼び出します。

ただし、ループを高速化することを期待している場合は、その可能性が嫌いです。fscanf はおそらく数学よりも何倍も遅いので、プログラムをより複雑にする一括読み取りスタイルに切り替えずに高速化するとは思えません。

于 2010-01-11T12:18:49.923 に答える