如何解析文件中的多种形式的数据?

时间:2019-02-17 01:04:48

标签: c file-io scanf fgets text-parsing

很抱歉,如果在线上有很多信息……我不知道为什么,但是我似乎无法将所有内容拼凑在一起,这使我无休止。

我正在做一个工作,我必须从文件中读取数据(在命令行参数中指定),然后创建函数以将相对于该函数的数据解析为动态二维数组。我基本上应该从这些数据创建一个成绩报告。

数据集的格式如下:

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

(这不是作业的确切样本数据集-我不是在寻找确切的答案,只是试图理解;我拥有的那个集无论如何都不是将用于测试的数据。) / p>

第一行是作业的数量,第二行是学生的数量,第三行是学生的姓名,其后的每一行是每个作业的每个学生的成绩。

#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 :(得分:0)

首先,这是行不通的:

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

这些将是可变长度的数组,这通常不是您想要的。但是,如果您的作业允许您使用它们,那么这样写仍然会出错,因为它们的大小为0

相反,从文件中找出assignsstus的实际值。之后,使用malloc分配内存(或在此时定义您的可变长度数组)。然后,用文件中的数据填充该内存。然后,关闭文件。之后,计算报告。最后,在程序结尾处释放内存。

要读取每个值,最简单的方法就是忽略行,然后简单地逐行读取它们(因为您确切知道行数)。