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");
}
}
Our language is Portuguese, so please translate your question.
– Penachia
You save the struct by passing as a parameter to sizeof
struct Carro
but reads usingficha
. Try reading too usingsizeof(struct Carro)
and see what happens...– Igor Cavalcanti