用C不打印任何内容

时间:2018-11-04 08:56:51

标签: c

我正在研究一个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;
}

3 个答案:

答案 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

input.txt

输出为

output