Как я могу разобрать несколько форм данных из файла? - PullRequest
0 голосов
/ 17 февраля 2019

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

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

Набор данных отформатирован следующим образом:

4
5
John Steve James Susan Emily
100 98 78 96 88
98 85 86 92 75
89 65 78 80 95
72 99 65 92 87

(Это не точный пример набора данных для назначения -- Я не ищу точного ответа, просто пытаюсь понять, у меня есть набор, который не является данными, которые будут использоваться для проверки в любом случае.)

Первая строка - это количество назначений, вторая -строка - это количество учеников, третья строка - это имена учеников, а каждая последующая строка - это оценка каждого ученика по каждому заданию.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define NAME_LENGTH 10

void getGrades(FILE *ifp, int assigns, int stus, int grades[assigns][stus], char students[stus][NAME_LENGTH]);
void printGrades(int assigns, int stus, int grades[assigns][stus]);
void getStudents(FILE *ifp, int stus, char students[stus][NAME_LENGTH]);
void printStudents(int stus, char students[stus][NAME_LENGTH]);
void calcGrades(int assigns, int stus, int grades[assigns][stus], double final_grades[]);
void printFinalLetterGrades(int stus, double final_grades[]);
void printPercentageGrades(int stus, char students[stus][NAME_LENGTH], double final_grades[]);

int main(int argc, char *argv[])
{
    FILE *ifp = NULL;
    int assigns = 0;
    int stus = 0;
    int grades[assigns][stus];
    char students[stus][NAME_LENGTH];
    double final_grades[stus];


    if (argc != 2)
    {   
        if (argc < 2)
        {   
            printf("Input file not specified: ./<exec> <infile>");
            exit(1);

        }
        else if (argc > 2)
        {
            printf("Too many arguments: ./<exec> <infile>");
            exit(1);

        }

    }   

    ifp = fopen(argv[1], "r");
    if (ifp == NULL)
    {
        printf("Error: could not open %s.", argv[1]);
        exit(1);

    }


    fscanf(ifp, "%d%d", &assigns, &stus);

    //functions will go in this section

    fclose(ifp);

    return 0;
}

Я открыл файл и использовал fscanf, чтобы прочитать первые две строки и присвоить их переменным 'assigns' и 'stus' соответственно, но мне нужно иметь возможность выполнять итерацию по всей совокупностиданные, чтобы иметь возможность заполнять двумерные массивы, «оценки» и «ученики» в их соответствующих функциях (getGrades и getStudents).Как я могу проанализировать эти данные, чтобы сделать это возможным?Я рассмотрел использование fgets для сканирования всего набора данных, а затем пытался проанализировать данные с помощью sscanf, но я чувствую, что есть кое-что гораздо менее сложное, чего мне не хватает, и я не могу понять, что это такое.Кроме того, я беспокоюсь о том, чтобы написать это так, чтобы это работало с имеющимся у меня образцом данных, но не с тем набором данных, с которым они тестируют.

Я собираюсь порвать волосыкто-нибудь может указать мне в правильном направлении?Как только я доберусь до этой точки, я уверен, что смогу понять все остальное.Большое, большое спасибо заранее!

1 Ответ

0 голосов
/ 17 февраля 2019

Прежде всего, это не сработает:

int assigns = 0;
int stus = 0;
int grades[assigns][stus];

Это будут массивы переменной длины, а это не то, что вы обычно хотите.Однако, если ваше назначение позволяет вам использовать их, оно все равно будет неправильно написано, потому что они будут иметь размер 0.

Вместо этого найдите фактическое значение assigns и * 1008.* из файла.После этого выделите память, используя malloc (или определите ваши массивы переменной длины на этом этапе).Затем заполните эту память данными из файла.Затем закройте файл.После этого вычисляем отчет.Наконец, в конце программы освободите память.

Чтобы прочитать каждое значение, проще всего забыть о строках и просто прочитать их одну за другой (поскольку вы точно знаете, сколько их будет).

...