Search code examples
cstructdynamic-memory-allocation

How to access which values are put in struct truely?


test_system.txt

UPLOADER_ID X1  Y1  X2  Y2  
1   1.00    1.00            
END                 
CUSTOMER_ID TIP X1  Y1  X2  Y2
1   3   2.00    1.00    2.00    1.00
2   2   3.00    1.00    3.00    1.00
3   1   4.00    1.00    4.00    1.00
4   1   5.00    1.00    5.00    1.00
5   2   6.00    1.00    6.00    1.00
6   2   7.00    1.00    7.00    1.00
7   1   8.00    1.00    8.00    1.00
8   1   9.00    1.00    9.00    1.00
9   2   10.00   1.00    10.00   1.00
10  1   11.00   1.00    11.00   1.00
11  1   12.00   1.00    12.00   1.00
END                 
LINE_ID X1  Y1  X2  Y2  
1   1.00    1.00    2.00    1.00    
2   2.00    1.00    3.00    1.00    
3   3.00    1.00    4.00    1.00    
4   4.00    1.00    5.00    1.00    
5   5.00    1.00    6.00    1.00    
6   6.00    1.00    7.00    1.00    
7   7.00    1.00    8.00    1.00    
8   8.00    1.00    9.00    1.00    
9   9.00    1.00    10.00   1.00    
10  10.00   1.00    11.00   1.00    
11  11.00   1.00    12.00   1.00    
END 

This was my text file which I have to read .

#include "stdlib.h"
#include "string.h"
#include "math.h"

typedef struct {
    int size,id,tip;
    float x1,x2,y1,y2;
}blocks;

int main() {
    blocks *block1 , *block2 , *block3;
    char line[60];
    int blcNum=1, sizer=0, temp;
    block1 = malloc( sizeof(blocks) );
    block2 = malloc( sizeof(blocks) );
    block3 = malloc( sizeof(blocks) );
    FILE *fp;
    fp = fopen("test_system.txt","r");
    while(!feof(fp)){
        fgets(line,60,fp);
            if ( strstr(line,"\0") != NULL && strstr(line,"ID") == NULL && strstr(line,"END") == NULL ) {
            sizer++;
            printf(line); 
            }
            else if ( strstr(line,"END") != NULL ){
                if ( blcNum == 1){
                    block1->size = sizer,blcNum++,sizer = 0;
                }
                else if ( blcNum == 2){
                    block2->size = sizer,blcNum++,sizer = 0;
                }
                else if ( blcNum == 3){
                    block3->size = sizer,blcNum++,sizer = 0;
                }
            }
    };
    block1 = realloc(block1 , block1->size * sizeof(blocks));
    block2 = realloc(block2 , block2->size * sizeof(blocks));
    block3 = realloc(block3 , block3->size * sizeof(blocks));
    fclose(fp);
    line == NULL,blcNum = 1;
    fp = fopen("test_system.txt","r");
    for ( temp =0 ; temp < block1->size ; ++temp)
    {
        while(!feof(fp)){
            fgets(line,60,fp);
            if (  strstr(line,"ID") == NULL && strstr(line,"END") == NULL && strstr(line,"\0") != NULL)
            {
                if ( blcNum == 1){
                    fscanf(fp,"%d %.2f %.2f",&(block1+temp)->id,&(block1+temp)->x1,&(block1+temp)->y1);
                }
                else if ( blcNum == 2){
                    fscanf(fp,"%d %d %.2f %.2f %.2f %.2f",&(block2+temp)->id,&(block2+temp)->tip,
                                                          &(block2+temp)->x1,&(block2+temp)->y1,
                                                          &(block2+temp)->x2,&(block2+temp)->y2);
                }
                else if ( blcNum == 3){
                    fscanf(fp,"%d %.2f %.2f %.2f %.2f",&(block3+temp)->id,&(block3+temp)->x1,
                                                       &(block3+temp)->y1,&(block3+temp)->x2,
                                                                          &(block3+temp)->y2);
                }
            }
            else if ( strstr(line,"END") != NULL ){
                    blcNum++;
            }
        }
    }
   fclose(fp);
   printf("\nUploader's information : \n");
   for (temp =0; temp < block1->size ; ++temp)
   {
    printf(" id : %d , X1 : %.2f , Y1 : %.2f  \n",(block1+temp)->id,(block1+temp)->x1,(block1+temp)->y1);
   }
   printf("\ncustomer's information : \n");
   for (temp =0; temp < block2->size ; ++temp)
   {
    printf(" id : %d , tip : %d , X1 : %.2f , Y1 : %.2f , X2 : %.2f , Y2 : %.2f \n",(block2+temp)->id,(block2+temp)->tip,(block2+temp)->x1,
                                                                                    (block2+temp)->y1,(block2+temp)->x2,(block2+temp)->y2);
   }
   printf("\nLine's information : \n");
   for (temp =0; temp < block3->size ; ++temp)
   {
    printf(" id : %d , X1 : %.2f , Y1 : %.2f , X2 : %.2f , Y2 : %.2f \n",(block2+temp)->id,(block2+temp)->x1,
                                                                         (block2+temp)->y1,(block2+temp)->x2,(block2+temp)->y2);
   }
    printf("\n1 . block's size : %d ",block1->size);
    printf("\n2 . block's size : %d ",block2->size);
    printf("\n3 . block's size : %d ",block3->size);
    free(block1);
    free(block2);
    free(block3);
    return 0;
} 

also this is my source code to get values from text file and put them in struct . Have done everyting that I know but can't access back what I put in struct truely . I'm newbie at here and C so someone would give a hand ?

There are 3 blocks in text source named uploader , customer and line which has id ,x1,x2,y1,y2 coordinate variables also customer has one more variable that named type .

I calculated their sizes with endlines doing ignore lines includes strings like "END" . Then allocated struct objects with their sizes before getting values from text source line by line .

So so how can I access them truely ?


Solution

  • Because of sizeof(block1) is different with sizeof(blocks). Let try to replace in your print function.