I am working on a project where I have to capture statistics of uuid occurrences for ALIVE/SEARCH/BYEBYE (it can be all 3, combinations of 2 each, or one alone) in a dynamically populated file in run time.
I am able to print all 3 combinations, but not in combination of 1 or 2 e.g.
If my input.txt is like this :
uuid:22314754-a597-490b-8a93-02cfae01036b ALIVE 16
uuid:22314754-a597-490b-8a93-02cfae01036b BYEBYE 8
uuid:22314754-a597-490b-8a93-02cfae01036b SEARCH 8
uuid:50e65653-7525-485d-83bf-d293558c4264 ALIVE 32
uuid:50e65653-7525-485d-83bf-d293558c4264 BYEBYE 8
uuid:50e65653-7525-485d-83bf-d293558c4264 SEARCH 132
uuid:55076f6e-6b79-4d65-6497-180373763bc1 ALIVE 113
uuid:55076f6e-6b79-4d65-6497-180373763bc1 BYEBYE 112
uuid:55076f6e-6b79-4d65-6497-180373763bc1 SEARCH 111
uuid:T0100203354 ALIVE 1
uuid:T0100203354 BYEBYE 2
uuid:T0100203354 SEARCH 3
My code :
#include<stdio.h>
#include<string.h>
struct uid
{
    char uid_val[100];
    char state[100];
    int temp_count;
    int alive_count;
    int search_count;
    int bye_count;
} UID[100];
int main()
{
    char str[100];
    int i = 0;
    int line = 0;
    char temp_val[100] = "waseem";
    FILE *fp1 = fopen("input.txt","r");
    FILE *fp2=fopen("output.txt","w");
    printf("init value is %s \n",temp_val);
    while(!feof(fp1))
    {
        fscanf(fp1,"%s %s %d",UID[i].uid_val,UID[i].state,&UID[i].temp_count);
        int ret = 0;
        ret=strcmp(UID[i].uid_val,temp_val);
        if (ret!=0)
        {
            printf("new UID_val is %s\n",UID[i].uid_val);
        }
        else
        {
        }
        temp_val[0] = '\0';
        strcpy(temp_val,UID[i].uid_val);
        if(strcmp(UID[i].state,"ALIVE")==0)
        {
            UID[i].alive_count = UID[i].temp_count;
        }
        else if(strcmp(UID[i].state,"BYEBYE")==0)
        {
            UID[i].search_count = UID[i].temp_count;
        }
        else
        {
            UID[i].bye_count = UID[i].temp_count;
        }
        line++;
        if(line%3 == 0)
        {
            i++;
        }
    }
    int n = 0;
    //fp2=fopen("output.txt","w");
    if (fp2==NULL)
    {
        printf("cant output to file\n");
    }
    else
    {
        fprintf(fp2,"Device ID\t\t\t\t\tALIVE\tBYEBYE\tSEARCH\n");
        for(n = 0;n < i;n++)
        {
            fprintf(fp2,"%s\t%d\t%d\t%d\n",UID[n].uid_val,UID[n].alive_count,UID[n].search_count,UID[n].bye_count);
        }
    }
        fclose(fp1);
        fclose (fp2);
        return 0;
    }
}
Gives the following output :(output.txt)
Device ID ALIVE BYEBYE SEARCH
uuid:22314754-a597-490b-8a93-02cfae01036b 16 8 8
uuid:50e65653-7525-485d-83bf-d293558c4264 32 8 132
uuid:55076f6e-6b79-4d65-6497-180373763bc1 113 112 111
uuid:T0100203354 1 2 3
I want to generalize the code such that uuid occurrence does not have to be all 3 (ALIVE/SEARCH/BYEBYE), the occurrences can be any combination and code should work. e.g my code gives wrong results when input.txt contains the following:
uuid:22314754-a597-490b-8a93-02cfae01036b BYEBYE 8
uuid:22314754-a597-490b-8a93-02cfae01036b SEARCH 8
uuid:50e65653-7525-485d-83bf-d293558c4264 ALIVE 32
uuid:50e65653-7525-485d-83bf-d293558c4264 BYEBYE 8
uuid:55076f6e-6b79-4d65-6497-180373763bc1 ALIVE 113
uuid:55076f6e-6b79-4d65-6497-180373763bc1 BYEBYE 112
uuid:55076f6e-6b79-4d65-6497-180373763bc1 SEARCH 111
uuid:T0100203354 BYEBYE 2
I am using ubuntu for gcc/g+ compiler.
 
     
     
    