【问题标题】:How can I parse multiple forms of data from a file?如何从文件中解析多种形式的数据?
【发布时间】:2019-07-10 18:29:54
【问题描述】:

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

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

数据集的格式如下:

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)中填充二维数组“grades”和“students”。我如何解析这些数据以使其成为可能?我考虑过使用 fgets 扫描整个数据集,然后尝试使用 sscanf 解析数据,但我觉得这里缺少一些不那么复杂的东西,我无法弄清楚它是什么。此外,我担心以这样的方式编写它,它可以与我拥有的样本数据集一起使用,但不能与他们测试的数据集一起使用。

我快把头发扯掉了,谁能指出我正确的方向?一旦我达到这一点,我确信我可以弄清楚其余的。非常非常感谢!

【问题讨论】:

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


    【解决方案1】:

    首先,这是行不通的:

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

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

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

    要读取每个值,最简单的方法是忘记行并简单地逐个读取它们(因为您确切知道它们将是多少)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-04
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多