Read and write structs in C

Asked

Viewed 55 times

0

I’m making a program that takes an indeterminate number of structs and stores them in a binary file, one at a time, and then uses another function to see all the structs inside that file.

At the moment whenever I run the list function, either it happens an infinite loop, or it appears only the last struct that I registered, instead of appearing the whole list of introduced cars.

    struct Carro
    {
        char Marca[30];
        char Modelo[30];
        char Cor[30];
        int Numero;
     } ficha;

void LISTA()
{
    FILE *fp;

    fp = fopen("dados.bin","rb");
    printf("\n\t\tLista\n");

     fseek(fp, 0L, SEEK_SET);   
    while(fread(&ficha, sizeof(ficha), 1 ,fp) )
    {
        printf ("\nID: %d \nMarca: %s\nModelo: %s\nCor: %s\n\n", ficha.Numero, ficha.Marca, ficha.Modelo, ficha.Cor);
    }

    fclose (fp); 


}

  void INSERIR ()
{

  FILE *fp;

fp = fopen("dados.bin", "wb");


    printf("\n\tIntroduza o novo automóvel:");
    printf("\n\n\nID:");
    fflush(stdin);
    scanf("%d", &ficha.Numero);


system("CLS");

int marca;
    printf("\n\tIntroduza o novo automóvel:");
    printf("\nMarca:");
    printf("\n\n1 - Aston Martin\n2 - Bentley\n3 - Jaguar\n\nSeleção -> ");
    fflush(stdin);
    scanf("%d", &marca);


    while((marca < 1) || (marca >3))
    {
        printf("Valor errado. Selecione novamente: ");
        fflush(stdin);
        scanf("%d", & marca);
    }   


    switch(marca)
    {
        case 1:
            strcpy(ficha.Marca, "Aston Martin");
                system("CLS");
                int modelo = 0;
                    printf("\n\tIntroduza o novo automóvel:");
                    printf("\nModelo:");
                    printf("\n\n1 - New Vantage\n2 - Vanquish S\n\nSeleção -> ");
                    fflush(stdin);
                    scanf("%d", &modelo);


                    while((modelo < 1) || (modelo >2))
                    {
                        printf("Valor errado. Selecione novamente: ");
                        fflush(stdin);
                        scanf("%d", &modelo);
                    }   


                    switch(modelo)
                    {
                        case 1:
                            strcpy(ficha.Modelo, "New Vantage");
                                system("CLS");
                                int cor = 0;
                                printf("\n\tIntroduza o novo automóvel:");
                                printf("\nCor:");
                                printf("\n\n1 - Skyfall Silver\n2 - Ultramarine Black\n\nSeleção -> ");
                                fflush(stdin);
                                scanf("%d", &cor);


                                while((cor < 1) || (cor >2))
                                {
                                    printf("Valor errado. Selecione novamente: ");
                                    fflush(stdin);
                                    scanf("%d", &cor);
                                }   


                                switch(cor)
                                {
                                    case 1:
                                        strcpy(ficha.Cor, "Skyfall Silver");
                                    break;

                                    case 2:
                                        strcpy(ficha.Cor, "Ultramarine Black");
                                    break;

                                }

                        break;

                        case 2:
                            strcpy(ficha.Modelo, "Vanquish S");
                                system("CLS");
                                int cor2 = 0;
                                printf("\n\tIntroduza o novo automóvel:");
                                printf("\nCor:");
                                printf("\n\n1 - Skyfall Silver\n2 - Ultramarine Black\n\nSeleção -> ");
                                fflush(stdin);
                                scanf("%d", &cor2);


                                while((cor2 < 1) || (cor2 >2))
                                {
                                    printf("Valor errado. Selecione novamente: ");
                                    fflush(stdin);
                                    scanf("%d", &cor2);
                                }   


                                switch(cor2)
                                {
                                    case 1:
                                        strcpy(ficha.Cor, "Skyfall Silver");
                                    break;

                                    case 2:
                                        strcpy(ficha.Cor, "Ultramarine Black");
                                    break;

                                }

                        break;

                    }


        break;

        case 2:
            strcpy(ficha.Marca, "Bentley");
                system("CLS");
                int modelo2 = 0;
                    printf("\n\tIntroduza o novo automóvel:");
                    printf("\nModelo:");
                    printf("\n\n1 - Bentayga\n2 - New Continental GT\n\nSeleção -> ");
                    fflush(stdin);
                    scanf("%d", &modelo2);


                    while((modelo2 < 1) || (modelo2 >2))
                    {
                        printf("Valor errado. Selecione novamente: ");
                        fflush(stdin);
                        scanf("%d", &modelo2);
                    }   


                    switch(modelo2)
                    {
                        case 1:
                            strcpy(ficha.Modelo, "Bentayga");
                            system("CLS");
                                int cor3 = 0;
                                printf("\n\tIntroduza o novo automóvel:");
                                printf("\nCor:");
                                printf("\n\n1 - Black Crystal\n2 - Magnetic\n\nSeleção -> ");
                                fflush(stdin);
                                scanf("%d", &cor3);


                                while((cor3 < 1) || (cor3 >2))
                                {
                                    printf("Valor errado. Selecione novamente: ");
                                    fflush(stdin);
                                    scanf("%d", &cor3);
                                }   


                                switch(cor3)
                                {
                                    case 1:
                                        strcpy(ficha.Cor, "Black Crystal");
                                    break;

                                    case 2:
                                        strcpy(ficha.Cor, "Magnetic");
                                    break;

                                }

                        break;


                        case 2:
                            strcpy(ficha.Modelo, "New Continental GT");
                            system("CLS");
                                int cor4 = 0;
                                printf("\n\tIntroduza o novo automóvel:");
                                printf("\nCor:");
                                printf("\n\n1 - Black Crystal\n2 - Magnetic\n\nSeleção -> ");
                                fflush(stdin);
                                scanf("%d", &cor4);


                                while((cor4 < 1) || (cor4 >2))
                                {
                                    printf("Valor errado. Selecione novamente: ");
                                    fflush(stdin);
                                    scanf("%d", &cor4);
                                }   


                                switch(cor4)
                                {
                                    case 1:
                                        strcpy(ficha.Cor, "Black Crystal");
                                    break;

                                    case 2:
                                        strcpy(ficha.Cor, "Magnetic");
                                    break;

                                }

                        break;

                    }

        break;

        case 3:
            strcpy(ficha.Marca, "Jaguar");
                system("CLS");
                int modelo3 = 0;
                    printf("\n\tIntroduza o novo automóvel:");
                    printf("\nModelo:");
                    printf("\n\n1 - F-Type\n2 - XE\n\nSeleção -> ");
                    fflush(stdin);
                    scanf("%d", &modelo3);


                    while((modelo3 < 1) || (modelo3 >2))
                    {
                        printf("Valor errado. Selecione novamente: ");
                        fflush(stdin);
                        scanf("%d", &modelo3);
                    }   


                    switch(modelo3)
                    {
                        case 1:
                            strcpy(ficha.Modelo, "F-Type");

                            system("CLS");
                                int cor5 = 0;
                                printf("\n\tIntroduza o novo automóvel:");
                                printf("\nCor:");
                                printf("\n\n1 - Portofino Blue\n2 - Santorini Black\n\nSeleção -> ");
                                fflush(stdin);
                                scanf("%d", &cor5);


                                while((cor5 < 1) || (cor5 >2))
                                {
                                    printf("Valor errado. Selecione novamente: ");
                                    fflush(stdin);
                                    scanf("%d", &cor5);
                                }   


                                switch(cor5)
                                {
                                    case 1:
                                        strcpy(ficha.Cor, "Portofino Blue");
                                    break;

                                    case 2:
                                        strcpy(ficha.Cor, "Santorini Black");
                                    break;

                                }


                        break;

                        case 2:
                            strcpy(ficha.Modelo, "XE");

                            system("CLS");
                                int cor6 = 0;
                                printf("\n\tIntroduza o novo automóvel:");
                                printf("\nCor:");
                                printf("\n\n1 - Caldera Red\n2 - Santorini Black\n\nSeleção -> ");
                                fflush(stdin);
                                scanf("%d", &cor6);


                                while((cor6 < 1) || (cor6 >2))
                                {
                                    printf("Valor errado. Selecione novamente: ");
                                    fflush(stdin);
                                    scanf("%d", &cor6);
                                }   


                                switch(cor6)
                                {
                                    case 1:
                                        strcpy(ficha.Cor, "Caldera Red");
                                    break;

                                    case 2:
                                        strcpy(ficha.Cor, "Santorini Black");
                                    break;

                                }


                        break;

                    }

        break;

    }


fwrite(&ficha, sizeof(struct Carro), 1 , fp);
fclose(fp); 

int end = 0;
printf("\n\nCarro Registado com sucesso!\n\nID: %d\nMarca: %s\nModelo: %s\nCor: %s\n\n1 - Menu\n2 - Sair\n\n-> ", ficha.Numero, ficha.Marca, ficha.Modelo, ficha.Cor);
fflush(stdin);
scanf("%d", &end);


    while((end < 1) || (end >2))
    {
        printf("\nValor errado. Selecione novamente: ");
        fflush(stdin);
        scanf("%d", &end);
    }   
if(end == 1)
{
        system("CLS");
        main();
}
else
{
    system("CLS");

}

}
  • 3

    Our language is Portuguese, so please translate your question.

  • You save the struct by passing as a parameter to sizeof struct Carro but reads using ficha. Try reading too using sizeof(struct Carro) and see what happens...

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.