I have the following .txt file:
1 7 9 12
8 4 22 5
4 9 0 10
15 2 3 14
I wanna print the lines in descending order based on the average value on each individual line.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 300
int comp(const void *p, const void *q) {
float l = *(const float *)p;
float r = *(const float *)q;
return (r - l);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Invalid format.\n");
return -1;
}
FILE *fin = fopen(argv[1], "r");
if (!fin) {
printf("Error opening the file.\n");
return 1;
}
char buf[MAX];
int n, countLines = 0;
float *avg;
while (fgets(buf, MAX, fin)) {
avg = realloc(avg, (countLines + 1) * sizeof(float *));
float sum = 0;
float countWords = 0;
char *word = strtok(buf, " ");
while (word) {
countWords++;
//printf("Word : %s\n", word);
n = atoi(word);
sum = sum + n;
word = strtok(NULL, " ");
}
avg[countLines] = (float)(sum / countWords);
countLines++;
}
qsort(avg, countLines, sizeof(float), comp);
for (int i = 0; i < countLines; i++) {
printf("%f\n", avg[i]);
}
free(avg);
fclose(fin);
return 0;
}
Output so far:
9.750000
8.500000
7.250000
5.750000
So I'm getting the right values, I just need to figure out how to print the actual lines, not the values. I know I'm supposed to use an array of structures but I don't really know how to do that. Any ideas? Thanks in advance