簡単な質問ですが、次の3つの操作を実行する方法はありますか。
while(...) {
fscanf(input, "%lf %lf", &t, &y);
tTotal += t;
yTotal += y;
}
scanfステートメント内でtとyがそれぞれtArrayとyArrayに追加される1つの操作で?形の何か
fscanf(input, "%lf %lf", ...code..., ...code...);
ありがとう、アッシュ。
これを行うにはfscanf()
、結果を格納する場所に加えて、必要な操作を知る必要があります (変数がまだ初期化されていない場合は未定義になります)。
それを行うためにラッパーを書くこともできfscanf()
ますが、それは非常に特定のユースケースでは大変な作業であり、最終的に += を実行するよりも遅くなります。
それは不可能。fscanf
スキャンした値をポインターで指定されたメモリ位置に書き込むだけで、その操作で加算を実行する方法はありません。
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));
}
...これは醜いですが機能します。
(免責事項: このコードはコンパイルしていません)
救助へのポインタ演算!
while(fscanf(input, "%lf %lf", t, y)) {t++; y++;}
どこで、最初に配列の先頭t
をy
指します。
もちろん、独自の境界チェックを追加する必要があります。
C ++では、これはかなり簡単ですが、Cでは(せいぜい)かなり難しい可能性があります。
問題は、何を達成しようとしているのかということです。
混乱を減らしたい場合は、次のようなインライン関数を作成します。
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 はおそらく数学よりも何倍も遅いので、プログラムをより複雑にする一括読み取りスタイルに切り替えずに高速化するとは思えません。