【问题标题】:Input and Output from a File in C [closed]C中文件的输入和输出[关闭]
【发布时间】: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。不要那样做;您已经通过包含&lt;stdio.h&gt; 声明了它。)
  • 您将fp 用于两个不同的流:一个用于输入,一个用于输出。这不起作用[即使它没有段错误,就像你现在得到的那样;-)]。您需要 两个:(例如,fpi 用于输入,fpo 用于输出)。然后,将所有fprintf 更改为使用fpo,将所有fscanf_s 更改为使用fpi。可能您还需要fpi = stdin;fpo = stdout;

标签: c file-io output


【解决方案1】:

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

程序应接受所有输入(例如,花名册大小、人数 编程作业、测试数量以及每个项目的信息 学生)从一个文件中。

这意味着:没有必要在命令行上询问学生人数和测试。您首先创建一些易于解析的包含学生信息的文本数据文件,断言 num_of_students

然后考虑该数据的几个基本用例:

  1. 学生想知道他的课程/成绩
  2. 史密斯教授需要知道参加他的所有学生 课程
  3. 摘要:有多少:学生、课程、每门课程的学生

没有人会检查这个程序是否会在命令行上手动输入 51 个名称、ID 以及 100 个等级,正如作业的引用部分所述,它既不需要也不需要.

希望对你有帮助

【讨论】:

  • 谢谢,我可以充分利用我的新能力。当您在 C 中分配时,您可以使用即 Python 进行原型设计/创建数据文件。如果您知道 Python 脚本可以轻松解析 datafiile_1.tsv van,您将节省大量尝试在 C 中复制功能的时间。否则,您将浪费时间寻找一些额外的空间、缺少昏迷等,而不是学习 C . 在一次性数据文件中。最佳
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多