Как получить доступ к значениям, которые положены в структуре верно? - PullRequest
0 голосов
/ 23 марта 2020

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 

Это был мой текстовый файл, который я должен прочитать.

#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;
} 

также это мой исходный код, чтобы получить значения из текстового файла и поместить их в структуру. Сделал все, что я знаю, но не могу получить доступ к тому, что я положил в структуру по-настоящему. Я новичок ie здесь и C, так что кто-то может помочь?

В исходном тексте есть 3 блока с именем uploader, customer и строкой с id, x1, x2, Координатные переменные y1, y2 также у покупателя есть еще одна переменная с именем type.

Я рассчитал их размеры с помощью конечных линий, игнорируя строки, включая строки типа "END". Затем выделите объекты структуры с их размерами, прежде чем получать значения из исходного текста построчно.

Так как же я могу получить к ним истинный доступ?

Ответы [ 4 ]

0 голосов
/ 26 марта 2020

Сегодня я понял, что эти указатели блоков прыгают через свои первые индексы, поэтому я не могу исправить.

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

typedef struct {
    int size;
    int id;
    int tip;

    float x1;
    float x2;
    float y1;
    float y2;
}blocks;
int credit();

int main() {  

    blocks *block1 , *block2 , *block3;
    char line[60];

    int index=1;
    int blcNum=1;
    int endCount=1;
    int temp;

    int sizer=0;
    int* sizep;
    sizep = malloc( (int*)(sizep + 3*sizeof(int)));


    block1 = malloc( sizeof(blocks) );
    block2 = malloc( sizeof(blocks) );
    block3 = malloc( sizeof(blocks) );

    FILE *fp;
    fp = fopen("IEEE_test_system_12.txt","r");

    // block's size calculator and memory allocater ;

    while(fgets(line,60,fp))
    {

            if ( strstr(line,"ID") == NULL && strstr(line,"END") == NULL ) 
            {
                sizer++;
            }
            else if( strstr(line,"END") != NULL )
            {

                if(endCount == 1)
                {
                    *(sizep + endCount*sizeof(int)) = sizer;
                    sizer=0;
                    endCount++;
                }
                else if(endCount == 2)
                {
                    *(sizep + endCount*sizeof(int)) = sizer;
                    sizer=0;
                    endCount++;
                }
                else if (endCount == 3)
                {
                    *(sizep + endCount*sizeof(int)) = sizer;
                    sizer=0;
                }

            }
    };

    block1->size = *(sizep + sizeof(int));
    block2->size = *(sizep+2*sizeof(int));
    block3->size = *(sizep+3*sizeof(int));

    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;
    fp = fopen("IEEE_test_system_12.txt","r");
    char *szTempString;
    while(fgets(line,60,fp))
    {

        if (  strstr(line,"ID") == NULL && strstr(line,"END") == NULL && strstr(line,"\0") != NULL)
        {


            szTempString = line;
            if ( blcNum == 1){
                printf("%s",line);
                sscanf(szTempString,"%d %f %f",&(block1 + (index*sizeof(blocks)))->id,&(block1 + (index*sizeof(blocks)))->x1,&(block1 + (index*sizeof(blocks)))->y1);
                index++;
            }
            else if ( blcNum == 2){
                printf("%s",line);
                sscanf(szTempString,"%d %d %f %f %f %f",&(block2 + (index*sizeof(blocks)))->id,&(block2 + (index*sizeof(blocks)))->tip, &(block2 + (index*sizeof(blocks)))->x1,&(block2 + (index*sizeof(blocks)))->y1,&(block2 + (index*sizeof(blocks)))->x2,&(block2 + (index*sizeof(blocks)))->y2);
                index++;
            }
            else if ( blcNum == 3){
                printf("%s",line);
                sscanf(szTempString,"%d %f %f %f %f",&(block3 + (index*sizeof(blocks)))->id,&(block3 + (index*sizeof(blocks)))->x1, &(block3 + (index*sizeof(blocks)))->y1,&(block3 + (index*sizeof(blocks)))->x2, &(block3 + (index*sizeof(blocks)))->y2);
                index++;
            }
        }
        else if ( strstr(line,"END") != NULL ){
                blcNum++;
                index = 0;
        }

    }   
    fclose(fp);
    printf("\nUploader's information : \n");
   for (temp =1; temp <= block1->size ; temp++)
   {
    printf(" id : %d , X1 : %.2f , Y1 : %.2f  \n",(block1+(temp*sizeof(blocks)))->id,(block1+(temp*sizeof(blocks)))->x1,(block1+(temp*sizeof(blocks)))->y1);
   } 

   printf("\nCustomer's information : \n");
   for (temp =1; temp <= block2->size ; temp++)
   {
    printf(" id : %d , tip : %d , X1 : %.2f , Y1 : %.2f , X2 : %.2f , Y2 : %.2f \n",(block2+(temp*sizeof(blocks)))->id,(block2+(temp*sizeof(blocks)))->tip,(block2+(temp*sizeof(blocks)))->x1,
                                                                            (block2+(temp*sizeof(blocks)))->y1,(block2+(temp*sizeof(blocks)))->x2,(block2+(temp*sizeof(blocks)))->y2);
   } 

   printf("\nLine's information : \n");
   for (temp =1; temp <= block3->size ; temp++)
   {
    printf(" id : %d , X1 : %.2f , Y1 : %.2f , X2 : %.2f , Y2 : %.2f \n",(block2+(temp*sizeof(blocks)))->id,(block2+(temp*sizeof(blocks)))->x1,
                                                                         (block2+(temp*sizeof(blocks)))->y1,(block2+(temp*sizeof(blocks)))->x2,
                                                                         (block2+(temp*sizeof(blocks)))->y2);
   }

    printf("\nblock1's size : %d ",block1->size);
    printf("\nblock2's size : %d ",block2->size);
    printf("\nblock3's size : %d ",block3->size);   
    printf("\na random number : %d",(block3->size*block2->size + block1->size));
    free(block1);
    free(block2);
    free(block3);
    //credit();
    return 0;
}```
Someone would find why first indexes are jumped ?
0 голосов
/ 24 марта 2020

@ KamilCuk @Hubert Nguyen

Я переделал и сократил свой исходный код, поскольку вы, ребята, посоветовали мне как

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct {
    int size;
    int id;
    int tip;

    float x1;
    float x2;
    float y1;
    float y2;
}blocks;

int main() {

    blocks *block1 , *block2 , *block3;
    char line[60];
    int blcNum=1;
    int sizer=0;
    int temp;
    block1 = malloc( sizeof(blocks) );
    block2 = malloc( sizeof(blocks) );
    block3 = malloc( sizeof(blocks) );

    FILE *fp;
    fp = fopen("test_system.txt","r");

    // block's size calculator and memory allocater ;
    while(fgets(line,60,fp))
    {
            if ( strstr(line,"\0") != NULL && strstr(line,"ID") == NULL && strstr(line,"END") == NULL ) {
            sizer++;
            }
            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;

    puts("\n\n");

    fp = fopen("test_system.txt","r");
    char *szTempString;
    int index=1;

    while(fgets(line,60,fp))
    {
        szTempString = line;
        if( strstr(line,"ID") == NULL && strstr(line,"END") == NULL )
        {
            printf("%s",line);
            if(index <= block1->size)
            {
                printf("%s",line);
                sscanf(szTempString,"%d %f %f",&(block1 + (index*sizeof(blocks)))->id,
                                               &(block1 + (index*sizeof(blocks)))->x1,
                                               &(block1 + (index*sizeof(blocks)))->y1);
                index++;
            }
        }

    }

   fclose(fp);

  printf("\nUploader's information : \n");
   for (temp =1; temp <= block1->size ; ++temp)
   {
    printf(" id : %d , X1 : %f , Y1 : %f  \n",(block1+(temp*sizeof(block1)))->id,(block1+(temp*sizeof(block1)))->x1,(block1+(temp*sizeof(block1)))->y1);
    puts("\nIt must be \nid : 1 , X1 : 1.00 , Y1 : 1.00");
   } 

    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;
}

, даже также не имеет доступа к значениям, таким как I wi sh, где проблема, он печатает строку правильно, но никогда не получит правильные значения: (

0 голосов
/ 24 марта 2020

Из-за sizeof (block1) отличается от sizeof (блоков) . Давайте попробуем заменить в вашей print функцию.

0 голосов
/ 23 марта 2020
  • Когда вы используете функцию fgets (line, 60, fp) в строке 46, указатель файла будет указывать на следующую строку при вызове функции fucntion fscanf . Я предлагаю вам использовать один указатель шаблона и ссылку на каждую строку, которую вы выводите, а затем проанализировать ее с помощью sscanf
  • Не следует использовать для (temp = 0; temp < block1-> size; ++ temp) , потому что в этом нет необходимости, потому что вы уже получили каждую строку, пока l oop. Вы можете использовать переменную, увеличивать ее в каждом блоке и сбрасывать в конце каждого блока.
  • Последняя проблема, которую я обнаружил, вы должны использовать index * (sizeof ( тип указателя)) для получения следующих элементов. Вот исходный код после того, как я исправил вышеуказанные проблемы на основе вашего исходного кода, надеюсь, что он может вам помочь:

Код:

#include "stdlib.h"
#include "string.h"
#include "math.h"
#include "stdio.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);
    char *szTempString;
    int index = 0;
    line == NULL,blcNum = 1;
    fp = fopen("test_system.txt","r");
    while(!feof(fp)){
        fgets(line,60,fp);
        if (  strstr(line,"ID") == NULL && strstr(line,"END") == NULL && strstr(line,"\0") != NULL)
        {
            szTempString = line;
            if ( blcNum == 1){
                sscanf(szTempString,"%d\t%f\t%f",&(block1 + (index*sizeof(blocks)))->id,&(block1 + (index*sizeof(blocks)))->x1,&(block1 + (index*sizeof(blocks)))->y1);
                index++;
            }
            else if ( blcNum == 2){
                sscanf(szTempString,"%d\t%d\t%f\t%f\t%f\t%f",&(block2 + (index*sizeof(blocks)))->id,&(block2 + (index*sizeof(blocks)))->tip, &(block2 + (index*sizeof(blocks)))->x1,&(block2 + (index*sizeof(blocks)))->y1,&(block2 + (index*sizeof(blocks)))->x2,&(block2 + (index*sizeof(blocks)))->y2);
                index++;
            }
            else if ( blcNum == 3){
                sscanf(szTempString,"%d\t%f\t%f\t%f\t%f",&(block3 + (index*sizeof(blocks)))->id,&(block3 + (index*sizeof(blocks)))->x1, &(block3 + (index*sizeof(blocks)))->y1,&(block3 + (index*sizeof(blocks)))->x2, &(block3 + (index*sizeof(blocks)))->y2);
                index++;
            }
        }
        else if ( strstr(line,"END") != NULL ){
                blcNum++;
                index = 0;
        }
    }    fclose(fp);    printf("\nUploader's information : \n");    for (temp =0; temp < block1->size ; temp++)    {
    printf(" id : %d , X1 : %.2f , Y1 : %.2f  \n",(block1 + (temp*sizeof(blocks)))->id,(block1 + (temp*sizeof(blocks)))->x1,(block1 + (temp*sizeof(blocks)))->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*sizeof(blocks)))->id,(block2 + (temp*sizeof(blocks)))->tip,(block2 + (temp*sizeof(blocks)))->x1,
                                                                                    (block2 + (temp*sizeof(blocks)))->y1,(block2 + (temp*sizeof(blocks)))->x2,(block2 + (temp*sizeof(blocks)))->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",(block3 + (temp*sizeof(blocks)))->id,(block3 + (temp*sizeof(blocks)))->x1,
                                                                         (block3 + (temp*sizeof(blocks)))->y1,(block3 + (temp*sizeof(blocks)))->x2,(block3 + (temp*sizeof(blocks)))->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; }
...