一个简单的问题,有没有办法执行这 3 个操作:
while(...) {
fscanf(input, "%lf %lf", &t, &y);
tTotal += t;
yTotal += y;
}
在 scanf 语句中 t 和 y 分别添加到 tArray 和 yArray 的一个操作中?某种形式的东西
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 可能比数学慢很多倍,所以我认为如果不切换到批量阅读风格,你不会加快速度,这会使程序更加复杂。