如果网上有很多关于这个的信息,我很抱歉...我不知道为什么,但我似乎无法将所有内容拼凑在一起,这让我感到沮丧。
我正在进行一项任务,我必须从文件中读取数据(在命令行参数中指定),然后创建函数以将相对于该函数的数据解析为动态二维数组。我基本上应该根据这些数据创建成绩报告。
数据集的格式如下:
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解析数据,但我觉得有一些不那么复杂的东西,我在这里缺少,我无法弄清楚它是什么。另外,我担心以这样的方式编写它,它将使用我拥有的示例数据集,但不会使用他们测试的数据集。
我要把头发撕掉,有人能指出我正确的方向吗?一旦我达到这一点,我确信我可以弄清楚剩下的。很多,非常感谢提前!
首先,这不会起作用:
int assigns = 0;
int stus = 0;
int grades[assigns][stus];
这些是可变长度数组,这不是您通常想要的。但是,如果你的作业允许你使用它们,那么它仍然是错误的,因为它们的大小是0
。
相反,从文件中找出assigns
和stus
的实际值。之后,使用malloc
分配内存(或者此时定义可变长度数组)。然后,用文件中的数据填充该内存。然后,关闭该文件。之后,计算报告。最后,在程序结束时,释放内存。
要阅读每个值,最简单的就是忘记线条,然后逐一阅读它们(因为你确切地知道它们的数量)。