C: scanf добавить к итогу - PullRequest
       15

C: scanf добавить к итогу

0 голосов
/ 11 января 2010

Быстрый вопрос, есть ли способ выполнить эти 3 операции:

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

в одной операции, где t и y добавляют себя в tArray и yArray соответственно внутри оператора scanf? Нечто вида

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

Спасибо, Эш.

Ответы [ 6 ]

2 голосов
/ 11 января 2010

Невозможно поместить сложение в параметры функции 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));
}

... что некрасиво, но работает.

(Отказ от ответственности: я не скомпилировал этот код)

2 голосов
/ 11 января 2010

Это невозможно. fscanf просто записывает отсканированные значения в ячейки памяти, указанные указателями, и нет способа заставить эту операцию выполнить какое-либо добавление.

2 голосов
/ 11 января 2010

Для этого потребуется fscanf(), чтобы знать, какую операцию вы хотите, в дополнение к месту хранения результата (и это будет неопределенным в случае, когда переменная еще не была инициализирована).

Вы можете написать обертку вокруг fscanf(), чтобы сделать это, но это очень большая работа для очень специфического варианта использования, и в конечном итоге это будет медленнее, чем просто выполнение + = после.

1 голос
/ 11 января 2010

Указатель арифметики на помощь!

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

Где t и y указывают на начало их массивов изначально.

Конечно, вам нужно добавить свои собственные проверки границ.

0 голосов
/ 11 января 2010

Вопрос в том, чего вы хотите достичь?
Если вы просто хотите уменьшить беспорядок, создайте встроенную функцию, например:

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, вероятно, во много раз медленнее математики, поэтому я не думаю, что вы сильно ускорите его, не переключившись на стиль массового чтения, что сделает программу намного более сложной.

0 голосов
/ 11 января 2010

В C ++ это было бы довольно легко, но в C это, вероятно, будет довольно сложно (в лучшем случае).

...