Ir ao conteúdo
  • Cadastre-se

Problemas com realloc


netinhocqc

Posts recomendados

Estou com um grande problema com a função realloc já pesquisei tanto mais não consigo resolver esse problema será que algume poderia me ajudar.


void preencher(cadastro *aluno, int cont){
FILE *arquivo;
if(aluno = (cadastro *)realloc(aluno,sizeof(cadastro)*cont) == NULL){
exit(0);
}
if((arquivo = fopen("Windows.txt","ab")) == NULL){
exit(0);
}
for(int i=0; i<cont; i++){
fflush(stdin);
printf("Digite o Nome do Aluno: ");
fgets(aluno->nome,30,stdin);
printf("Digite a Idade do Aluno: ");
scanf("%d",&aluno->idade);
printf("Digite a Matricula do Aluno: ");
scanf("%d",&aluno->matricula);
fwrite(&aluno,sizeof(struct cadastro),1,arquivo);
}
fclose(arquivo);
}

Link para o comentário
Compartilhar em outros sites

É realmente eu andei pesquisando e fiz a função de ponteiro para ponteiro mais agora o problema é na função imprimir. Cara já perdi noites de sono tentando resolver isso :wacko:

Está o código completo


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct cadastro{
char nome[30];
int idade;
int matricula;
}cadastro;

void preencher(cadastro **aluno, int cont);
void imprimir(cadastro *aluno);
void pesquisar(cadastro *aluno);
void criar();

int main(){
int op;
FILE *arquivo;
int cont=0;
cadastro *aluno;
aluno = (cadastro *)malloc(sizeof(cadastro)*cont);
criar();
printf("\t\t\t\tCadastro de Alunos\n\n");
do{
printf("--------------------------------------------------------------------------------\n\n");
printf("\t\t\t\t(1) - Cadastrar Aluno \n");
printf("\t\t\t\t(2) - Lista Alunos \n");
printf("\t\t\t\t(3) - Pesquisar Aluno \n");
printf("\t\t\t\t(4) - Ordenar Lista\n");
printf("\t\t\t\t(5) - Remover Alunos\n");
printf("\t\t\t\t(6) - Sair\n\n");
printf("--------------------------------------------------------------------------------\n\n");
printf("Digite sua opcao: ");
scanf("%d",&op);
switch(op){
case 1:
cont++;
preencher(&aluno, cont);
break;
case 2:
imprimir(aluno);
break;
case 3:
pesquisar(aluno);
break;
default:
printf("Saindo!\n");
}
}while(op != 6);
system("pause");
}
void criar(){
FILE *arquivo;
if((arquivo = fopen("Windows.txt","wb")) == NULL){
exit(0);
}
fclose(arquivo);
}
void pesquisar(cadastro *aluno){
FILE *arquivo;
char Npesquisa[50];
fflush(stdin);
if((arquivo = fopen("Windows.txt","rb")) == NULL){
exit(0);
}
printf("--------------------------------------------------------------------------------\n\n");
printf("Digite do Aluno que deseja pesquisar: ");
fgets(Npesquisa,50,stdin);
printf("\n");
if(fread(&aluno,sizeof(struct cadastro),1,arquivo) != 1){
exit(0);
}
if(strcmp(Npesquisa,aluno->nome) == 0){
fread(&aluno,sizeof(struct cadastro),1,arquivo);
printf("Nome: %sIdade: %d\nMatricula %d\n",aluno->nome, aluno->idade, aluno->matricula);
}else{
printf("Nome nao encontrado\n");
}
fclose(arquivo);
printf("--------------------------------------------------------------------------------\n\n");
}


void imprimir(cadastro *aluno){
FILE *arquivo;
if((arquivo = fopen("Windows.txt","rb")) == NULL){
exit(0);
}
while (1) {
if(fread(&aluno, sizeof (struct cadastro), 1, arquivo) < 1 )
break;
}
printf("Nome: %sIdade: %d\nMatricula %d\n",aluno->nome, aluno->idade, aluno->matricula);
fclose(arquivo);
}

void preencher(cadastro **aluno, int cont){
FILE *arquivo;
realloc((*aluno),sizeof(cadastro)*cont);

if((arquivo = fopen("Windows.txt","ab")) == NULL){
exit(0);
}
fflush(stdin);
printf("Digite o Nome do Aluno: ");
fgets((*aluno)->nome,30,stdin);
printf("Digite a Idade do Aluno: ");
scanf("%d",&((*aluno)->idade));
printf("Digite a Matricula do Aluno: ");
scanf("%d",&((*aluno)->matricula));
fwrite(&(*aluno),sizeof(struct cadastro),1,arquivo);
fflush(arquivo);
fclose(arquivo);
}



Link para o comentário
Compartilhar em outros sites

Salve netinhocqc,

O que ocorre com esse seu código é que alguns conceitos de ponteiros ficaram de fora e isso acabou complicando um pouco as coisas. Eu mesmo quando passei os olhos pela primeira vez nesse programa achei que iria encontrar uma lista encadeada. Basicamente, você tenta usar o ponteiro como se estivesse usando uma variável comum. A ideia da estrutura dinâmica de dados ficou de fora.

Eu tentei aproveitar ao máximo o seu código e para isso tive que reescrever algumas coisas. Apenas as funções para cadastrar e listar os alunos foram completadas. As outras precisam também ser reescritas/modificadas. Dê uma olhada:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct cadastro {
char nome[30];
unsigned char idade;
int matricula;
} cadastro;

void preencher(cadastro **aluno);
void imprimir(cadastro *aluno);
void carga(cadastro **aluno);

cadastro *pt_aux = NULL;
int cont = 0;

int main()
{
char op;
FILE *arquivo;

cadastro *aluno = NULL;

carga(&aluno);

printf("\t\t\t\tCadastro de Alunos\n\n");
do {
printf("--------------------------------------------------------------------------------\n\n");
printf("\t\t\t\t(1) - Cadastrar Aluno \n");
printf("\t\t\t\t(2) - Lista Alunos \n");
printf("\t\t\t\t(3) - Pesquisar Aluno \n");
printf("\t\t\t\t(4) - Ordenar Lista\n");
printf("\t\t\t\t(5) - Remover Alunos\n");
printf("\t\t\t\t(6) - Sair\n\n");
printf("\t\t\t\tNumero de Alunos Cadastrados: %d\n", cont);
printf("--------------------------------------------------------------------------------\n\n");
printf("Digite sua opcao: ");
scanf("%d",&op);
switch(op) {
case 1:
preencher(&aluno);
break;
case 2:
imprimir(aluno);
break;
default:
printf("\nSaindo!\n\n");
}
} while(op != 6);

free(pt_aux);
free(aluno);
}

void carga(cadastro **aluno)
{
FILE *arquivo;
long tam;

if (!(arquivo = fopen("Windows.txt","a+b"))) {
exit(1);
}

fseek (arquivo, 0, SEEK_END);
tam = ftell(arquivo);
rewind(arquivo);

cont = tam / sizeof(cadastro);
if (cont > 0) {
*aluno = (cadastro *) malloc (sizeof(cadastro)*cont);
fread (*aluno, 1, sizeof(cadastro) * cont, arquivo);
}

fclose(arquivo);
}

void imprimir(cadastro *aluno)
{
FILE *arquivo;
int i;

for (i = 0; i < cont; i++) {
printf("Nome: %s\nIdade: %d\nMatricula %d\n", aluno[i].nome, aluno[i].idade, aluno[i].matricula);
}
}

void preencher(cadastro **aluno)
{
FILE *arquivo;

cont++;

pt_aux = (cadastro *)realloc(*aluno, sizeof(cadastro)*cont);
*aluno = pt_aux;

if (!(arquivo = fopen("Windows.txt","ab"))) {
exit(1);
}

fflush(stdin);

printf("Digite o Nome do Aluno: ");
gets((*aluno)[cont-1].nome);
printf("Digite a Idade do Aluno: ");
scanf("%d",&((*aluno)[cont-1].idade));
printf("Digite a Matricula do Aluno: ");
scanf("%d",&((*aluno)[cont-1].matricula));

fwrite(&(*aluno)[cont-1], sizeof(cadastro), 1, arquivo);

fflush(arquivo);
fclose(arquivo);
}

Algumas coisas foram modificadas. Vou ressaltar a mais importante. Qualquer outra dúvida, é só postar.

A primeira coisa que eu fiz foi implementar uma forma de ter acesso aos registros de maneira dinâmica. Uma forma de ter esses cadastros em memória e assim poder percorrê-los a qualquer momento. Uma boa opção para isso seria as listas encadeadas. Mas iria ter que mexer e acrescentar bastante coisa.

Então, aproveitei a sua ideia inicial e criei uma estrutura que pudesse ser acessada facilmente através de índices. Basicamente, o que você tem agora é um array dinâmico. Analisando o seu código, passa a impressão que essa era a ideia que você tinha em mente ao criar esse programa.

Alguns tipos de dados foram modificados também; a função criar() deu lugar à função carga(), que tem por objetivo fazer a carga dos elementos em memória, etc.

O que falta agora? Obviamente as outras opções e também incluir as várias checagens de consistência que deixei de fora. Ex. verificar se foi possível criar o arquivo, se foi possível alocar memória, etc.

Dê uma comparada e poste as dúvidas, fica melhor.

;)

NW

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...