我正在研究一个C语言程序,该程序可以存储您需要执行的任务。现在,我正在尝试创建一个将您需要完成的任务分组的分组系统。
程序读取“ input.txt”文件。您必须先编写要输入的任务数,然后下一行采用这种格式。 { YYYYMMDD HHMM(重要性1〜10)(组0〜4)(标题)(子标题)}。例如:20181101 0530 5 1计算机编码。
但是问题是,现在我需要以这种格式列出每个组中有多少个任务。 {(组0中的任务)(组1)(组2)(组3)(组4)}。因此,当第0组中有 4个任务,第2组中有 2个任务时,第4组中有 1个任务,它会打印出“ 4 0 2 0 1 ”。
我正在处理的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Tasks{
int date;
int time;
int i;
int group;
char title[127];
char sub[127];
};
struct Groups{
int gr0;
int gr1;
int gr2;
int gr3;
int gr4;
};
int main(){
FILE *file;
int num;
int j;
struct Tasks task[num];
struct Groups group;
file = fopen("input.txt", "r+");
fscanf(file, "%d", &num);
rewind(file);
for(j=0;j<num;j++){
fscanf(file, "%d %d %d %d %s %s\n",
&task[j].date, &task[j].time, &task[j].i, &task[j].group,
&task[j].title, &task[j].sub);
}
for(j=0;j<num;j++){
switch(task[j].group){
case 0:
group.gr0 = group.gr0 + 1;
break;
case 1:
group.gr1 = group.gr1 + 1;
break;
case 2:
group.gr2 = group.gr2 + 1;
break;
case 3:
group.gr3 = group.gr3 + 1;
break;
case 4:
group.gr4 = group.gr4 + 1;
break;
}
}
printf("%d %d %d %d %d",
group.gr0, group.gr1, group.gr2,
group.gr3, group.gr4);
return 0;
}
答案 0 :(得分:1)
您正在将文件中的第一个数字读入num
,然后尝试读取此次数的输入。对我来说,这似乎是您输入的内容是从存在的项目数开始的,然后列出了每个项目。
但是,您正在调用rewind()
的一个,您已经读取了num
的值,然后继续读取输入。如您所知,rewind()
带您回到文件的开头。这意味着,在您尝试读取第一个项目时,您实际上正在读取项目数以及第一个项目,并且您的输入处理将被取消。 / p>
您可能需要删除rewind()
呼叫。
答案 1 :(得分:0)
稍微修改了代码并注释了更改。应该可以,可能还有些孔...
顺便说一句,您不应使用VLA。它们在C99之后是可选的,并且不能依赖于可用。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
struct Tasks{
int date;
int time;
int i;
int group;
char title[127];
char sub[127];
};
struct Groups{
int gr0;
int gr1;
int gr2;
int gr3;
int gr4;
};
int main(){
FILE *file;
int num;
int j;
//RO access
file = fopen("input.txt", "r");
if(!file){
perror("");
return 1;
}
fscanf(file, "%d", &num);
struct Tasks task[num];
//Init the struct so you dont have random garbage values
struct Groups group = {0};
//Need to move that up so you get a valid content for num in your task definition.
//file = fopen("input.txt", "r+");
//fscanf(file, "%d", &num);
// Can't rewind, you will be reading num again
//rewind(file);
for(j=0;j<num;j++){
//Last two arguments automatically decay to a pointer, & is wrong.
if(6 != fscanf(file, "%d %d %d %d %s %s\n", &task[j].date, &task[j].time, &task[j].i, &task[j].group, task[j].title, task[j].sub)){
printf("Error on reading file!\n");
fclose(file);
return 1;
}
}
//Don't forget to close it
fclose(file);
for(j=0;j<num;j++){
switch(task[j].group){
case 0:
group.gr0 = group.gr0 + 1;
break;
case 1:
group.gr1 = group.gr1 + 1;
break;
case 2:
group.gr2 = group.gr2 + 1;
break;
case 3:
group.gr3 = group.gr3 + 1;
break;
case 4:
group.gr4 = group.gr4 + 1;
break;
}
}
printf("%d %d %d %d %d", group.gr0, group.gr1, group.gr2, group.gr3, group.gr4);
return 0;
}
答案 2 :(得分:0)
对于您的程序,不需要添加rewind()
函数。由于num
的值是文件中的第一个元素,因此文件的其余部分包含有关组和任务的数据。
#include <stdio.h>
#include <string.h>
` #include <stdlib.h`>
#include <errno.h>
struct Tasks{
int date;
int time;
int i;
int group;
char title[127];
char sub[127];
};
struct Groups{
int gr0;
int gr1;
int gr2;
int gr3;
int gr4;
};
int main(){
FILE *file;
int num;
int j;
file = fopen("input.txt", "r");
if(!file){
perror("");
return 1;
}
fscanf(file, "%d", &num);
struct Tasks task[num];
struct Groups group = {0};
//scanning rest of the file (from line 2 on wards)
for(j=0;j<num;j++){
fscanf(file, "%d %d %d %d %s %s\n", &task[j].date, &task[j].time, &task[j].i, &task[j].group, task[j].title, task[j].sub);//
}
fclose(file);
for(j=0;j<num;j++){
switch(task[j].group){
case 0:
group.gr0 = group.gr0 + 1;
break;
case 1:
group.gr1 = group.gr1 + 1;
break;
case 2:
group.gr2 = group.gr2 + 1;
break;
case 3:
group.gr3 = group.gr3 + 1;
break;
case 4:
group.gr4 = group.gr4 + 1;
break;
}
}
printf("%d %d %d %d %d", group.gr0, group.gr1, group.gr2, group.gr3, group.gr4);
return 0;
}
input.txt contains
输出为