Ajuda em C - Alocação dinâmica de memória

hatelover

Power Member
Pois bem.. tenho uns trabalhos para fazer para uma disciplina de programação e estou um bocado empancado agora que cheguei a esta parte da matéria!

A primeira parte do trabalho consistia em criar uma base de dados em ficheiro, para controlar uma espécie de registo de matrículas\proprietários! O interesse era usar uma estrutura dada e revermos o uso de estruturas assim como o manuseamento de ficheiros.

Até aí tudo bem.. já não tinha programação há algum tempo, mas nunca tive grandes problemas porque esta parte não me era desconhecida de todo!

Agora é nesta parte, que nos pedem para alterar o programa anterior, usando alocações de memória, carregando todo o ficheiro para a memória etc, que fiquei encravado e pedia a vossa ajuda..

Deixo em baixo o enunciado do problema, e todo o código que já tinha feito até agora!

ENUNCIADO disse:
Exercício

Pretende-se implementar o programa da aula 2 com as seguintes alterações:

- No arranque o programa deverá carregar para memória todos os registos contidos no
ficheiro.
- Numa inserção, tanto o conteúdo do ficheiro como da memória deverão ser actualizados
(ver função realloc()).
- Numa eliminação, tanto o registo no ficheiro como a respectiva cópia em memória
deverão ser marcados como "apagados", no respectivo campo da estrutura.
- As impressões deverão ser feitas a partir dos dados em memória, sem consulta do
ficheiro.

Exemplos de alocação dinâmica de memória e respectiva utilização (considere as
declarações abaixo):

typedef struct {
int i;
char c;
} mystruct_t;

mystruct_t *ptr;


Exemplo 1:

ptr = malloc(sizeof(mystruct_t));
(*ptr).i=1;
ptr->i=1;
ptr[0].i=1; //as 3 instruções anteriores são equivalentes


Exemplo 2:

ptr = malloc(NUMERO_DE_REGISTOS*sizeof(mystruct_t));
ptr[0].i=1;
ptr[0].c='a';
ptr[1].i=2;
ptr[1].c='b';
...
printf("%d %c\n", ptr[0].i, ptr[0].c);


CÓDIGO disse:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME_BUFFER_SIZE 80

/*#################################*/
/* Estrutura de dados */
/*#################################*/

typedef struct {
char matricula[6];
char proprietario[NAME_BUFFER_SIZE];
char apagado; //diferente de zero significa apagado, inicializado a 0
} veiculo_t;

void menuprint ();
void adicionar_registo();
void listar_registos();
void apagar_registo();

void menu_print() {
system("clear");
printf("_______________________________________");
printf("\n| |");
printf("\n| |");
printf("\n| Registo Automovel |");
printf("\n| |");
printf("\n|_____________________________________|");
}

void apagar_registo () {
int size;
char temp_mats[8];
veiculo_t VEICULO;
fpos_t *pos;
FILE *registo;
if ((registo=fopen("registo.dat","r+"))) {
system("clear");
menu_print();
printf("\n\n\n > Introduza a matricula para apagar: ");
fgets(temp_mats,8,stdin);
if ((size = strlen(temp_mats)) != 7) {
printf("\n\nA matricula nao foi correctamente inserida!\nNota: a matricula deve ser introduzida sem Separadores\nP.E.: 88-88-AA deve ser introduzido como 8888AA!");
printf("\n\nPrima qualquer tecla para continuar");
getchar();
}
else {
fgetpos(registo,pos);
while (fread(&VEICULO,sizeof(veiculo_t),1,registo) != 0) {
if ((memcmp(VEICULO.matricula,temp_mats,6)) == 0) {
fsetpos(registo,pos);
VEICULO.apagado=1;
fwrite(&VEICULO,sizeof(veiculo_t),1,registo);
fflush(registo);
printf("\n - Matricula ");
fwrite(temp_mats,6,1,stdout);
printf(" apagada com sucesso");
}
fgetpos(registo,pos);
}
printf("\n_______________________________________");
printf("\nPrima qualquer tecla para continuar");
getchar();
system("clear");
fclose(registo);
}
}
else {
system("clear");
menu_print();
printf("\nO ficheiro nao existe. Nao e possivel listar registos!");
printf("\n_______________________________________");
printf("\nPrima qualquer tecla para continuar");
getchar();
system("clear");
}
}


void listar_registos () {
veiculo_t VEICULO;
FILE *registo;
int count=1;
if ((registo=fopen("registo.dat","rb"))) {
system("clear");
menu_print();
printf("\n\nListagem dos veiculos existentes:\n");
printf("_______________________________________\n");
while (fread(&VEICULO,sizeof(veiculo_t),1,registo) != 0) {
if (!VEICULO.apagado) {
printf("\n[%d] > Matricula: ",count);
fwrite(&VEICULO.matricula,6,1,stdout);
printf("\n > Proprietario: %s",VEICULO.proprietario);
count++;
}
}
printf("_______________________________________");
printf("\nPrima qualquer tecla para continuar");
getchar();
system("clear");
fclose(registo);
}
else {
system("clear");
menu_print();
printf("\n\nO ficheiro nao existe. Nao e possivel listar registos!");
printf("\n_______________________________________");
printf("\nPrima qualquer tecla para continuar");
getchar();
system("clear");
}
}


void adicionar_registo () {
veiculo_t VEICULO;
FILE *registo;
registo=fopen("registo.dat","ab");
char temp_mat[8];
int size;
VEICULO.apagado=0;
system("clear");
menu_print();
printf("\n\nNota: a matricula deve ser introduzida sem separadores\nP.E.: 88-88-AA deve ser introduzido como 8888AA!\n\n- Introduza a matricula do automovel: ");
fgets(temp_mat,8,stdin); // ### Recebemos os 6 digitos da matricula, mais \n e \0 ###
if ((size = strlen(temp_mat)) != 7) {
printf("\n\nA matricula nao foi correctamente inserida!\nNota: a matricula deve ser introduzida sem Separadores\nP.E.: 88-88-AA deve ser introduzido como 8888AA!");
printf("\n\nPrima qualquer tecla para continuar");
getchar();
}
else {
memcpy(VEICULO.matricula,temp_mat,6);
printf("- Introduza o respectivo proprietario: ");
fgets(VEICULO.proprietario,NAME_BUFFER_SIZE,stdin);
fwrite(&VEICULO,sizeof(veiculo_t),1,registo);
fclose(registo);
printf("_______________________________________");
printf("\n\n - Matricula:");
fwrite(temp_mat,6,1,stdout);
printf("\n\n - Proprietario:");
fwrite(VEICULO.proprietario,6,1,stdout);
printf("\n_____________________________________");
printf("\n\nPrima qualquer tecla para continuar");
getchar();
system("clear");
}
}

main () {
FILE *registo;
veiculo_t VEICULO;
int s;
system("clear");
menu_print();
printf("\n\nPrima qualquer tecla para continuar...");
getchar();
system("clear");
do {
menu_print();
printf("\n\nEscolha uma das opcoes seguintes:");
printf("\n\n[1]- Inserir Registo");
printf("\n[2]- Listar Registos");
printf("\n[3]- Apagar Registo");
//printf("\n[4]- Pesquisar Registo");
printf("\n[0]- Fechar a aplicacao\n\nOpcao: ");
scanf("%d",&s);
getchar();
switch (s) {
case 1:
adicionar_registo();
break;
case 2:
listar_registos();
break;
case 3:
apagar_registo();
break;
case 0:
system("clear");
break;
}
}while(s);
}
 
Boas, basicamente tens de ter atenção que para alocar dinâmicamente tens de o fazer seja para vectores ou strings. Não sei até que ponto precisarás de alocar mais alguma coisa, mas em principio podes começar por aqui, nestes dois tenho a certeza que os tens de alocar, agora se queres saber como, uma vez que usas realloc e eu nunca o usei, usava na altura o malloc ou outro, já n tenho bem a certeza, logo é uma questão de procurares bem!
 
Back
Topo