很抱歉,如果在线上有很多信息……我不知道为什么,但是我似乎无法将所有内容拼凑在一起,这使我无休止。
我正在做一个工作,我必须从文件中读取数据(在命令行参数中指定),然后创建函数以将相对于该函数的数据解析为动态二维数组。我基本上应该从这些数据创建一个成绩报告。
数据集的格式如下:
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解析数据,但是我觉得这里缺少的东西要简单得多,我无法弄清楚它是什么。另外,我担心以这种方式编写代码,使其无法与我拥有的样本数据集一起使用,而无法与他们测试的数据集一起使用。
我要拔头发了,有人能指出我正确的方向吗?一旦达到这一点,我相信我可以弄清楚其余的事情。谢谢!
答案 0 :(得分:0)
首先,这是行不通的:
int assigns = 0;
int stus = 0;
int grades[assigns][stus];
这些将是可变长度的数组,这通常不是您想要的。但是,如果您的作业允许您使用它们,那么这样写仍然会出错,因为它们的大小为0
。
相反,从文件中找出assigns
和stus
的实际值。之后,使用malloc
分配内存(或在此时定义您的可变长度数组)。然后,用文件中的数据填充该内存。然后,关闭文件。之后,计算报告。最后,在程序结尾处释放内存。
要读取每个值,最简单的方法就是忽略行,然后简单地逐行读取它们(因为您确切知道行数)。