Чтение текстовых файлов с помощью strtol в C построчно

Итак, у меня есть эта функция, которая находит среднее значение всех чисел в файле:

float averageOfNumbers(FILE *fp_in)
{
    int n=0,S=0;
    char red[1024];char *ptr;
    int p_a_h;
    float sr;

    while(!feof(fp_in)){
    if(fgets(red,1024,fp_in)!=NULL){
        ptr =red;
    while(p_a_h = strtol(ptr, &ptr, 10)){

        if((p_a_h>0&&S>INT_MAX-p_a_h)||(p_a_h<0&&S<INT_MIN-p_a_h)){
            printf("OVERFLOW\n");
            break;
        }
        else{
        S=p_a_h+S;
        n++;}

        }
    }
    }
    sr=S/n;
    return sr;
}

Он отлично работает, когда в файле только числа, но если он найдет что-то кроме цифры, программа вылетит. Как сделать так, чтобы программа игнорировала другие символы. Например, вот текстовый файл:

wdadwa 321 1231 das 421124 1 wdasdad 4 1412515
sad14312 yitiyt453534 3554312 sad -2 -53 -12 -231 #@!
#!312 -2 241 -46343 sada 21312 65454

Среднее должно быть: 310422


person glavata    schedule 23.03.2014    source источник
comment
feof() используется неправильно выше.   -  person pmg    schedule 23.03.2014


Ответы (1)


Добавьте дополнительную проверку в условие if.

p_a_h==0 && (strlen(ptr)>1 || (strlen(ptr)==1 && ptr[0]!='0'))

Я использую тот факт, что strtol возвращает 0L, если преобразование недействительно (если строка содержит нецифровые символы). Но проверка только этого также пропускает, если фактическая строка содержит 0. Я оставляю остальных, чтобы понять это самостоятельно.

person nitish712    schedule 23.03.2014