0

一个简单的问题,有没有办法执行这 3 个操作:

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

在 scanf 语句中 t 和 y 分别添加到 tArray 和 yArray 的一个操作中?某种形式的东西

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 回答