C中文件的输入和输出

时间:2016-05-04 02:25:38

标签: c file-io output

这项家庭作业是:

  • 实施一个模仿ECE 173班级名单的程序。名单上最多有50名学生。

  • 每位学生都有一个姓氏,名字,学生证,编程作业的可能分数(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;
}

它构建成功,但它有一个错误&#34; Debug Assertion失败!在尝试调试时

1 个答案:

答案 0 :(得分:1)

我错过了发表评论的要点,所以使用答案。你必须:

  

该计划应该采取所有输入(例如,名册大小,数量   编程分配,测试次数和每个的信息   来自档案的学生。

这意味着:没有必要在命令行上询问学生数量,测试。首先创建一些易于解析的文本数据文件,其中包含有关学生的信息,断言num_of_students&lt; 51,学生姓名或至少他们的身份证是唯一的,等等。 除了良好的输入文件,你还应该创建几个搞砸的文件。因此,您可以显示您的程序如何处理错误的输入。

然后考虑一下这些数据的基本用例:

  1. 学生想知道他的课程/成绩
  2. 教授史密斯需要知道参加他的所有学生 当然
  3. 总结:有多少:学生,课程,每门课程的学生
  4. 没有人会检查这个程序是否会在命令行上手动输入51个名称,ID,加上说100个等级,并且如在赋值的引用部分中所述,它既不需要也不是预期的

    希望有所帮助