Как я могу суммировать все числа в текстовом файле? - PullRequest
0 голосов
/ 25 января 2020

У меня проблема с суммированием всех чисел из текстового файла. Это может показаться простым, но проблема в том, что мой код не распознает 2000 как 2000, а как 2,0,0,0, поэтому он будет воспринимать число как 4 отдельных числа:

Я пытался прочитать текстовый файл один письмо как время, так как я также хотел посчитать, сколько раз появляется письмо

Это текст, который я хотел прочитать:

D ie Ruhr-Universität Bochum (RUB) в Бохуме ist mit 42954 Studierenden (Stand WS 2018/19) eine der zehn größten Universitäten in Deutschland.

D ie RUB war 1962 (Aufnahme des Lehrbetriebs 1965) d ie erste Universitätsneugründung in der Bundesrepubli. D ie Universität wurde außerhalb der Stadt als Campus-Universität в Керенбурге, Великобритания D ie Universität, d ie Wohnstadt Hustadt und das beide versorgende Einkaufszentrum Uni-Center dominieren seither den Stadtteil.

int main()
{
char txtname[2000];
FILE *fp;
int buchstaben[26] = {0};
int i;
int temp;
int sum;


printf("Dateiname:\n");

scanf("%s",&txtname);

printf("%s",&txtname);

strcat(txtname,".txt");

fp = fopen(txtname,"r");




if(fp == NULL) {
    printf("Datei konnte nicht geoeffnet werden.\n");
}else {
    while( (temp=fgetc(fp)) != EOF)
        {
        if(temp >= 'a' ||  temp <= 'z')
         buchstaben[(temp - 'a')]++;
         if( temp >= 'A' || temp <= 'Z')
         buchstaben[(temp - 'A')]++;
         if(temp>= 48 || temp<= 57)
    }
    printf("Anzahl der einzelnen Buchstaben: \n");

    for(i=0;i<26;i++)

    printf("Buchstabe %c kommt %d mal vor.\n",i+'a',buchstaben[i]);
    }
    printf("Die Summe aller Zahlen sind:%d",sum);

    fclose(fp);
}

Ответы [ 3 ]

2 голосов
/ 25 января 2020

Ваш l oop читает по одному символу за раз. Когда вы видите ди git, вы должны прочитать все цифры и превратить их в число во время чтения цифр.

Один из способов сделать это, следуя вашим if(temp>= '0' && temp<= '9') до l oop символам чтения и обработка цифр.

Однако последний символ, который вы сейчас читаете, это , а не a di git. Затем вы заканчиваете свой di git чтением l oop, но теперь у вашего внешнего l oop есть проблема, потому что символ был прочитан, но еще не обработан. Чтобы исправить это, используйте ungetc (посмотрите в документации).

if(temp>= '0' && temp<= '9') {
    int number= temp-'0';
    while ((temp= fgetc(fp))>='0' && temp <='9')
        number= number * 10 + (temp-'0');
    ungetc(temp,fp);
    sum += number;
}

Читая число '20', вы сначала прочитали 2. Следующая ди git, которую вы видите, означает, что число, которое вы уже прочитали, в десять раз больше, поэтому вы умножаете его на десять. Затем вы превращаете ASCII di git в десятичное число, вычитая '0' и добавляя его к числу, которое вы уже прочитали. Обратите внимание, что код ASCII гарантирует, что символы di git имеют порядок '0,'1','2',...'9', поэтому '3' - '0' = 3

0 голосов
/ 27 января 2020

Бин ау ан дер руб, канн мэн дич зуфаллиг irgendwo kontaktieren? Раздор или так? Hab das selbe Задача w ie du aber komme nicht weiter.

0 голосов
/ 25 января 2020

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

int sum=0;
if (temp >= '0' && temp <= '9') {
    sum += atoi(temp);
    while (temp >= '0' && temp <= '9') {
        temp=fgetc(fp); //skip the rest of the number
    }
}
...