Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
netinhocqc

Problemas com realloc

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • É 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);
    }



    Editado por netinhocqc
    alteração no código

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Cara humildemente eu tenho que lher agradeçer e muito por você ter entendido essa confusão, obrigado mesmo.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×