Ошибка сегментации при попытке анализа файла .CSV в стиле Excel [программирование на C] - PullRequest
0 голосов
/ 19 октября 2019

Я застрял в этом проекте большую часть недели, и пока я перебирал синтаксические ошибки.

Суть проекта - прочитать заголовки и остановиться на определенном этапе. столбец и найти определенные характеристики, такие как мин, максимум и среднее значение столбца. Тем не менее, я испытываю трудности с распределением памяти для этой работы. До сих пор мне не удавалось продвинуть свой код, потому что я продолжаю получать ошибку с пометкой Segmentation Fault: 11.

. Раздел, выделенный жирным шрифтом, - это то, к чему я сузил проблему. Я знаю, что есть проблема с памятью, но я не могу понять, почему fgets не читает в первой строке файла из функции. Файл также не возвращает NULL и может быть доступен. Динамические массивы - вариант, но я новичок и очень незнаком с ними.


double getMin(char csvfile[], char column[])
{
    int counter= 0;
    int counter2= 0;
    char* token;
    char type;
    char activity[20];
    int chap, sec;
    int min = -1000;
    char header[20];
    char *res;
char row[3000];
char Toprow[3000];

    sscanf(column, "%c%d.%d", &type, &chap, &sec);
    if (type!='P' && type!='C' && type!='L') return -2.0;
    if (chap<=0 || sec<=0) return 0;

    if(type == 'c' || type == 'C'){
        sprintf(activity,"%challange", type);
    }
    else if(type == 'P' || type == 'p'){
        sprintf(activity,"%carticipation", type);
    }
    else {
        sprintf(activity,"%cab", type);
    }

    sprintf(header, "%d.%d - %s", chap, sec, activity);

    FILE*  inFile = NULL;
   inFile = fopen("array.csv","r"); 
    //This is where the trouble begins that Ive narrowed down to 

    while(!feof(inFile)){
        fgets(Toprow, 3000, inFile);
        while(token != NULL){
            counter = counter + 1;
            token = strsep(&Toprow, ",");
            printf("%s", token);
            res = strstr(token, header);
            if(res){
            break;
                token = NULL;
                }
            }
    } 
        while (!feof(inFile)) {
            int currVal= 0;
            fgets(row, 3000, inFile);
            if(feof(inFile)) break;
            while( (token = strsep(&row, ','))  != NULL){
                ++counter2;
                    if(counter2 == counter){
                        res = strstr(token, header);
                        if(!res){
                        int currVal = atoi(*token);
                            if(currVal > min)
                                min = currVal;
                        counter2 = 0;
                        break;
                        }
                    }

                }
        }
    return min;
}

Файл Excel выглядит для справки введите описание изображения здесь

...