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

问题描述 投票:0回答:1

如果网上有很多关于这个的信息,我很抱歉...我不知道为什么,但我似乎无法将所有内容拼凑在一起,这让我感到沮丧。

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

数据集的格式如下:

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解析数据,但我觉得有一些不那么复杂的东西,我在这里缺少,我无法弄清楚它是什么。另外,我担心以这样的方式编写它,它将使用我拥有的示例数据集,但不会使用他们测试的数据集。

我要把头发撕掉,有人能指出我正确的方向吗?一旦我达到这一点,我确信我可以弄清楚剩下的。很多,非常感谢提前!

c file-io scanf fgets text-parsing
1个回答
0
投票

首先,这不会起作用:

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

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

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

要阅读每个值,最简单的就是忘记线条,然后逐一阅读它们(因为你确切地知道它们的数量)。

© www.soinside.com 2019 - 2024. All rights reserved.