Среднее значение строки файла CSV в C

#c #csv #average #stdio

#c #csv #среднее #стандартный формат

Вопрос:

У меня есть файл CSV с 5 строками и 10 столбцами (каждая строка содержит 10 элементов в виде десятичных дробей). Мне нужно написать программу, которая открывает и считывает файл и принимает среднее значение каждой строки.

 void exercise3(){
     FILE* Khoa_file=fopen("beeap20_knows_coding.csv", "r");  // attempt to open the file
    double sum , ave; //making decimal varibales
    int i;    //i as int to to use for the sum calculation

    if (Khoa_file==NULL){    //if the file opens nothiing (eg. not found)
        perror("Error while opening file");     // print this as error
    }
    while(1){                  //while true
        int s;         // variable in which content of file will be saved in
        while((s=fgetc(Khoa_file)) !='n' amp;amp; s != EOF){   /*while loop, the idea was to use fgets to make a while loop . The fgets was supposed to take in data until it ecounters 'n', 
                                                            then that would be 1 row and the next while loop would do the same thing (5x in total), but didnt work...*/
            printf("%c", s);   // print out the "gotten" values 
        }
        if(s == EOF)
            break;    // when reaching the end of the file break out of the loop 
        printf("t");
         sum = 0;
        while(1==fscanf(Khoa_file, "%d%*c", amp;i)){//%*c skip ',' and 'n'   
            sum  = i;

        }
        ave = sum / 10 ;
        printf("the average %fn", ave);
    }
    fclose(Khoa_file);
}
 

Это то, что я пытался, но это полный мусор. Пожалуйста, помогите..

Комментарии:

1. Не могли бы вы объяснить, что происходит и почему это неправильно? «Полный мусор» немного непонятен. Будьте конкретны.

Ответ №1:

Просто сделайте что-то вроде:

 int val[10];
while( 10 == scanf("%d%d%d%d%d%d%d%d%d%d ", val, val   1, val   2 ...) ){
...
}
 

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

 while( 10 == scanf("%d ,%d ,%d ,%d ,%d ,%d ,%d ,%d ,%d ,%d ", ...
 

Это не проверяет, что входные данные составляют 10 записей данных в строке, но это работает, если ваш ввод соответствует соглашению о том, что в каждой строке всего 9 запятых. Кроме того, он будет работать с вводом типа «5, n6, …», где 10 точек данных занимают несколько строк. Удалите пробелы в строке формата по желанию. Если вы заботитесь о точном формате ввода и хотите проверить вхождения новых строк, вы можете либо использовать fgets , либо заменить конечный пробел в строке формата %c и проверить, что scanf считывает явное n . Но простого структурирования вашего цикла while для чтения 10 элементов данных одновременно с одним scanf , вероятно, будет достаточно для ваших нужд.