2013-08-24 2 views
2

Я читаю текстовый файл чисел, и я хочу получить сумму этого числа, как определить количество чисел в текстовом файле. " мой текстовый файл состоит из одной строки»как определить количество чисел в текстовом файле в C

это код, который я написал, как определить количество чисел в текстовом файле, чтобы поместить его вместо переменной„количество чисел“в второй линии кода

int main() 
{ 
    FILE *file = fopen("numbers.txt", "r"); 
    int integers[number of numbers]; 
    int i=0; 
    int j=0; 
    int num; 

    while(fscanf(file, "%d", &num) > 0) { 
     integers[i] =num; 
     printf("%d",integers[i]); 
     printf("\n"); 
     i++; 
    } 

    int sum=0; 
    for(j=0;j<sizeof(integers)/sizeof(int);j++) 
    { 
     sum=sum+integers[j]; 
    } 

    printf("%d",sum); 
    printf("\n"); 
    fclose(file); 
    return 0; 
} 
+1

Для этого вам нужно будет прочитать файл один раз, подсчитать строки, закрыть его, снова открыть (или искать начало) и снова прочитать все. Вместо этого вы считали, что отслеживаете сумму при чтении и печати каждого номера? Нет причин хранить их и вычислять сумму позже. –

+0

Все, что сказал Павел, не подсчитывает строки. Нет причин делать это. Каждый успешно вызвал 'scanf()' (вы должны проверить результат возврата, btw) будет еще одним номером, чтобы добавить к вам «количество номеров» аккумулятора, а вместе с ним и накопленную сумму. Массив бесполезен для задания количества чисел и их суммы. – WhozCraig

ответ

1

Если вам не нужны отдельные номера, но только сумму всех из них, что вы должны сделать, это просто добавить их вместе в то же самое время, когда вы читаете их:

int sum = 0; 
int num; 
while(fscanf(file, "%d", &num) > 0) { 
    sum += num; 
    printf("%d",num); 
    printf("\n"); 
} 

На другой рукой, если вам действительно нужно сохранить каждый номер, вы можете сделать это по-разному.

  • Сначала вы можете прочитать файл при подсчете чисел, затем начать поиск, выделить нужную память и снова прочитать сохранение каждого номера.
  • Сначала вы можете запросить некоторую память, и когда вы закончите (вам нужно будет отслеживать, сколько свободных мест у вас есть), запросите больше памяти (realloc) и продолжайте делать это, пока не закончите ,
  • Вы можете использовать связанный список вместо массива, если вам не нужен произвольный доступ.

Edit: Если какое-то случае вам нужно сделать насчитайте, и, таким образом, что вам действительно нужно общее количество чисел, которые Вы читаете, просто объявить int n = 0; и внутри цикла сделать ++n; так что вы имеете его в конец.

+0

... что такое 'n'? – nneonneo

+0

'++ n; sum + = num; 'и' printf ("% d \ n", num) ', вероятно, вы собираетесь, где' n' - количество чисел, 'sum' - их суммарное суммирование и' num' - это только что прочитанный номер. – WhozCraig

+1

Этот ответ совершенно неправильный. –

4

Если вы хотите, чтобы это сделать, есть три возможных решения:

  1. сделать integers довольно большим (скажем, 10000 элементов) и сказать «Слишком много чисел», если их больше, чем «довольно большое» число.
  2. Прочтите файл дважды, посчитайте число номеров в первый раз, второй раз сохраните их.
  3. Используйте динамическое распределение и начинайте с небольшого числа, когда это число достигнуто, используйте realloc для выделения большего массива, пока не будут прочитаны все номера.

Однако в вашем конкретном случае то, что вы делаете, может быть выполнено без всякого хранения чисел. Таким образом, весь массив integers совершенно не нужен.

Вобще:

sum += num; 

в первом цикле.

4

Сначала выясните, действительно ли вам нужно сохранить каждое число. Довольно часто можно выполнять простую обработку данных путем вычисления некоторого промежуточного результата без необходимости сохранять каждый вход. Например, можно вычислить среднее и стандартное отклонение входного набора без сохранения входного набора данных.

В вашем конкретном примере вы можете печатать каждое число, когда оно читается, а затем накапливать их в sum, без необходимости хранить их все.

Если вы решите, что вам действительно нужно, чтобы сохранить каждый номер, то у вас есть два варианта:

  1. Прочитайте файл один раз, чтобы подсчитать количество чисел, а затем выделить массив, а затем fseek назад к началу чтобы прочитать их все.
  2. Выделите начальный массив, затем используйте realloc для постепенного увеличения его размера (в этом случае обязательно увеличивайте размер по фиксированному коэффициенту при необходимости, а не просто увеличивайте размер на единицу).
Смежные вопросы