【发布时间】:2016-05-04 02:25:37
【问题描述】:
这个家庭作业是:
实施一个模仿 ECE 173 班级名册的程序。名册最多有 50 名学生。
每个学生都有姓氏、名字、学生 ID、编程作业的可能分数 (1–5) 以及测试的可能分数(1 和 2)。使用结构和函数来开发程序。
程序应从文件中获取所有输入(例如,花名册大小、编程作业数量、测试数量和每个学生的信息)。输入所有信息后,用户应该能够显示输入的信息,并将屏幕输出写入文件。
注意:您提交的文件必须包含五个用于测试程序的不同输入文件。
我已经完成了与 ECE 173 班级名册相关的第一部分。然而,我真的在这个作业的输入/输出部分苦苦挣扎。这就是我现在所拥有的;它构建成功,但是在运行程序时,它停止了。
#include <stdio.h>
struct test{double testgrade;
};
struct hw{double hwgrade;
};
struct student{
char first[30];
char last[30];
int stuID;
struct hw hwamount[5];
struct test testamount[2];
};
int main() {
int rostersize;
int testnumber;
int hwnumber;
FILE *fp;
FILE * fop;
fp = stdin;
fop = stdout;
fp = fopen("eceroster_in.txt", "r");
fop = fopen("eceroster_out.txt", "w");
//fprintf(fp, "How many students are there?\n");
fscanf_s(fp, "%d", &rostersize);
while (rostersize >50){
//printf("Roster cannot exceed 50 students!\n");
fscanf_s(fp, "%d", &rostersize);
}
struct student roster[50];
//fprintf(fp, "How many tests are there?\n");
fscanf_s(fp, "%d", &testnumber);
while (testnumber >2){
//printf("Cannot exceed 2 tests!\n");
fscanf_s(fp, "%d", &testnumber);
}
//fprintf(fp,"How many assignments are there?\n");
fscanf_s(fp, "%d", &hwnumber);
while (hwnumber >5){
//fprintf (fp, "Cannot exceed 5 assignments!\n");
fscanf_s(fp,"%d", &hwnumber);
}
for (int i = 0; i < rostersize; i++){
//fprintf(fp, "Enter student's last name:\n");
fscanf_s(fp, "%s", &(roster[i].last));
//fprintf(fp, "Enter student's first name:\n");
fscanf_s(fp, "%s", &(roster[i].first));
//fprintf(fp, "Enter the student's ID:\n");
fscanf_s(fp, "%i", &(roster[i].stuID));
for (int j = 0; j < testnumber; j++){
//fprintf(fp, "Enter the student grade for test %d\n", j+1);
fscanf_s(fp, "%lf", &(roster[i].testamount[j].testgrade));
}
for (int k = 0; k < hwnumber; k++){
//fprintf(fp, "Enter the student grade for assignment %d\n", k+1);
fscanf_s(fp, "%lf", &(roster[i].hwamount[k].hwgrade));
}
}
//fprintf(fp, "How many times would you like your roster to print?\n");
int rosterAmount;
fscanf_s(fp, "%d", &rosterAmount);
for (int j = 0; j < rosterAmount; j++){
for (int k = 0; k < rostersize; k++){
fprintf(fop, "Name: %s %s \n", &(roster[k].first, roster[k].last));
fprintf(fop, "Student ID: %d\n", &(roster[k].stuID));
for (int mm = 0; mm < testnumber; mm++){
fprintf(fop, "Test %d: %.1f\n", &
(mm+1,roster[k].testamount[mm].testgrade));
}
for (int m = 0; m < hwnumber; m++){
fprintf(fop, "Assignment %d: %.1f\n", & (m+1,roster[k].hwamount[m].hwgrade));
}
fprintf(fop, "_______________________________\n");
}
}
fclose (fp);
fclose (fop);
return 0;
}
构建成功,但尝试调试时出现错误“Debug Assertion Failed!”
【问题讨论】:
-
不能同时打印和扫描到同一个文件。
-
提示:在 StackOverflow 中发布“截止日期”总是一个坏主意。整整两天的时间来调试你的作业已经足够了。
-
你想用这条线做什么:
FILE * fopen(char * eceroster, char * r);?使用模式"r"打开文件"eceroster"?如果是这样,那将不会那样做。 -
fp是一个空指针,您永远不会将其设置为其他任何值。你永远不会打电话给fopen。 (您无用地声明fopen。不要那样做;您已经通过包含<stdio.h>声明了它。) -
您将
fp用于两个不同的流:一个用于输入,一个用于输出。这不起作用[即使它没有段错误,就像你现在得到的那样;-)]。您需要 两个:(例如,fpi用于输入,fpo用于输出)。然后,将所有fprintf更改为使用fpo,将所有fscanf_s更改为使用fpi。可能您还需要fpi = stdin;和fpo = stdout;