Ir para conteúdo
Fórum Script Brasil
  • 0

Alocacao Dinamica


Pexera

Pergunta

Olá pessoal, estou implementando um trablaho de estrutura de dados e primeiramente gostaria de dizer que não busco o trabalho pronto, então vou postar somente a parte especifica que esta com problema.

Seguinte, o progra cujos codigos vou colar abaixo, deve importar atraves da funcao "insere_evento_arquivo", dados sobre eventos registras em um arquivo texto agenda.txt, porem no laco de leitura e alocacao de memoria o programa simplesmente fecha e não sei mais como corrigir o erro.

Segue os fontes:

Main.c (não consegui por em CODEBOX)

#include <stdio.h>

#include <stdlib.h>

#include "estrutura.h"

EVENTO *evento;

EVENTO *inicio;

int main(){

int opcao = 1;

inicio=NULL;

while(opcao !=0){

menu();

scanf("%d",&opcao);

chama_funcao(opcao,evento,inicio);

}

printf("\n\n");

system("PAUSE");

return 0;

}

Estrutura.h

#ifndef _ESTRUTURA_H

#define _ESTRUTURA_H

#define TAM_CHAR 50

struct evento{

char nome[TAM_CHAR];

char data[10];

char hora[15];

char local[TAM_CHAR];

struct evento *prox;

struct evento *ant;

};

typedef struct evento EVENTO;

void insere_evento(EVENTO *evento,EVENTO *inicio);

void insere_evento_arquivo(EVENTO *evento,EVENTO *inicio);

void insere_evento_tela(char nome[TAM_CHAR], int data_dia, int data_mes, int data_ano, char horario, char local[TAM_CHAR]);

void altera_evento(char nome[TAM_CHAR]); //- se altera mês deve trocar a posição na lista de meses

void remove_evento(char nome[TAM_CHAR]);

void consulta_evento_nome(char nome[TAM_CHAR]); // Saida: datadia, datames, dataano, horário, local);

void consulta_evento_data(int data_dia,int data_mes,int data_ano); // S: lista_eventos exibir em ordem cronológica de data

void consulta_eventos_mes(int data_mes); // S: lista_eventos);

void consulta_eventos(); //S: todos lista_eventos)- em ordem de data ou alfabética pelo nome do evento, ou por outro critério de ordenação à escolha

void consulta_eventos_recentes(); //S:cinco últimos eventos manipulados:evento inserido ou alterado (usar fila circular)

void menu();

void chama_funcao(int opcao,EVENTO *evento,EVENTO *inicio);

#endif

Estrutura.c

#include <stdio.h>

#include <stdlib.h>

#include "estrutura.h"

void insere_evento(EVENTO *evento,EVENTO *inicio){

int opcao=1;

printf("\n1 - Arquivo\n2 - Tela\n0 - Retorna\n");

scanf("%d",&opcao);

switch(opcao){

case 0: break;

case 1: insere_evento_arquivo(evento,inicio);

break;

case 2:

system("pause");

break;

default: printf("\nOpcao incorreta!\n");

system("pause");

break;

}

}

/* -------------------------------------------------------------------------- */

void insere_evento_arquivo(EVENTO *evento,EVENTO *inicio){

FILE *arq;

char arqStr[50],linha[TAM_CHAR];

short int i = 0;

EVENTO *atual = inicio;

fflush(stdin);

printf("Digite o nome do arquivo:\n");

//scanf("%s", arqStr);

if ((arq = fopen("agenda.txt" /*arqStr*/,"r")) == NULL){

fprintf(stderr, "Problema encontrado na abertura do arquivo!");

exit(-1);

}

// while(!feof(arq)){

for(i=0;i<6;i++){

printf("\naki:%d",i);

evento=(EVENTO*)malloc(sizeof(evento));

printf("\nzzzzzzzzzz:%d",i);

evento->ant=NULL;

evento->prox=NULL;

atual = inicio;

if(inicio == NULL){

inicio = evento;

}

else{

while(atual->prox != NULL){

atual = atual->prox;

}

evento->ant = atual;

atual->prox = evento;

}

fgets(evento->nome,TAM_CHAR,arq);

fgets(evento->data,TAM_CHAR,arq);

fgets(evento->hora,TAM_CHAR,arq);

fgets(evento->local,TAM_CHAR,arq);

printf("\n==================================");

printf("\n%d",i);

printf("\nlinha %d: %s", i, evento->nome);

printf("\nlinha %d: %s", i, evento->data);

printf("\nlinha %d: %s", i, evento->hora);

printf("\nlinha %d: %s", i, evento->local);

printf("\n==================================");

}

fclose(arq);

printf("\nTotal de eventos importados: %d\n", i);

system("pause");

return;

}

/* -------------------------------------------------------------------------- */

void menu(){

system("cls");

printf("========================== Agenda Cultural ==========================\n");

printf("\n1 - Insere novo evento");

printf("\n2 - Altera evento");

printf("\n3 - Exclui evento");

printf("\n4 - Consulta evento por nome");

printf("\n5 - Consulta evento por data");

printf("\n6 - Consulta evento por mes");

printf("\n7 - Lista todos os eventos");

printf("\n8 - Lista 5 ultimos eventos. (cadastrados/alterados)");

printf("\n0 - SAIR\n");

}

void chama_funcao(int opcao,EVENTO *evento,EVENTO *inicio){

switch(opcao){

case 0: break;

case 1: insere_evento(evento,inicio);

break;

case 2:

break;

case 3:

break;

case 4:

break;

case 5:

break;

case 6:

break;

case 7:

break;

case 8:

break;

default: printf("\nOpcao incorreta!\n");

system("pause");

break;

}

}

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

o erro ta na linha do malloc(), certo??

acho q o certo seria isso:

evento=(EVENTO*)malloc(sizeof(EVENTO));

o sizeof() tem q pegar o tamanho do EVENTO com letra maiusculo (q se refere a struct).

se você pegasse o tamanho do evento com letra minuscula, acho q ele retornaria o tamanho ocupado pelo pontero dessa struct, e todo pontero ocupa 4 bytes (em sistemas de 32 bits), o q não seria suficiente pra guardar toda a struct.

Link para o comentário
Compartilhar em outros sites

  • 0
o erro ta na linha do malloc(), certo??

acho q o certo seria isso:

evento=(EVENTO*)malloc(sizeof(EVENTO));

o sizeof() tem q pegar o tamanho do EVENTO com letra maiusculo (q se refere a struct).

se você pegasse o tamanho do evento com letra minuscula, acho q ele retornaria o tamanho ocupado pelo pontero dessa struct, e todo pontero ocupa 4 bytes (em sistemas de 32 bits), o q não seria suficiente pra guardar toda a struct.

vlwwssssss muito obrigado mesmo, já tava pirando com isso, asuahsuahs que erro tosco meu, mas enfim é akela velha coisa não é?, uma opniao de fora sempre acha essas coisas..^^

muito obrigado mesmo.

mais uma duvida agora heheh esta importando errado os dados, é algo com o tamanho da leitura eu acho mas n tenho certeza,

Deveria importar:

Noite na Musica Latina

05/01/2010

21h

Casa da Cultura

mas importa

Noite na Musica Latina

05/01/201021h

21h

Casa da Cultura

Editado por Pexera
Link para o comentário
Compartilhar em outros sites

  • 0

isso na hora de mostrar na tela??

bom, eu nem sei a estrutura da funcao fgets() (alias, nem sei o q ela faz), mas olhando o seu codigo aqui, eu reparei:

struct evento{
char nome[TAM_CHAR];
char data[10];
char hora[15];
char local[TAM_CHAR];
struct evento *prox;
struct evento *ant;
};[/code]
[code]fgets(evento->nome,TAM_CHAR,arq);
fgets(evento->data,TAM_CHAR,arq);
fgets(evento->hora,TAM_CHAR,arq);
fgets(evento->local,TAM_CHAR,arq);

você declara data com tamanho 10 e hora com tamanho 15. mas na hora de ler com o fgets, você passa o tamanho TAM_CHAR (q vale 50). o certo não seria passar 10 e 15??

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0
isso na hora de mostrar na tela??

bom, eu nem sei a estrutura da funcao fgets() (alias, nem sei o q ela faz), mas olhando o seu codigo aqui, eu reparei:

struct evento{
char nome[TAM_CHAR];
char data[10];
char hora[15];
char local[TAM_CHAR];
struct evento *prox;
struct evento *ant;
};
fgets(evento->nome,TAM_CHAR,arq);
fgets(evento->data,TAM_CHAR,arq);
fgets(evento->hora,TAM_CHAR,arq);
fgets(evento->local,TAM_CHAR,arq);

você declara data com tamanho 10 e hora com tamanho 15. mas na hora de ler com o fgets, você passa o tamanho TAM_CHAR (q vale 50). o certo não seria passar 10 e 15??

então ai é que esta se eu faco isso o resultado é:

Noite na Musica Latina

05/01/201

0

21h

e se eu altero a struct da forma abaixo fica da mesma forma que a do post anterior =/

struct evento{

char nome[TAM_CHAR];

char data[TAM_CHAR];

char hora[TAM_CHAR];

char local[TAM_CHAR];

struct evento *prox;

struct evento *ant;

};

Editado por Pexera
Link para o comentário
Compartilhar em outros sites

  • 0

ta, isso acontece porque a data ocupa 10 caracteres. ai você declarou o array com 10 posicoes. acontece, q é necessaria uma posicao a mais pra guardar o caracter de fim de string ('\ 0'). então, na hora de ler do txt, ele vai ler as 9 primeras posicoes da data e vai adicionar o '\ 0'. quando for pra ler a hora, ele continua de onde parou e vai ler o ultimo caracter da data ate a quebra de linha.

se você declarar a data com 11 posicoes (e mandar ler 11 com o fgets()), isso deve ser resolvido.

entretanto, pelo q entendi, o txt ta separado em linhas. e isso pode atrapalhar tb.

não fiz o teste aqui, mas tb, se não me engano, a quebra de linha é adicionada na string com o fgets(). e se você estiver usando windows, imagino q ele va adicionar os dois caracteres CR e LF. por conta disso, acho q o melhor seria declarar a data com 13 posicoes (e mandar ler 13 com o fgets()).

tente ai.

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0
ta, isso acontece porque a data ocupa 10 caracteres. ai você declarou o array com 10 posicoes. acontece, q é necessaria uma posicao a mais pra guardar o caracter de fim de string ('\ 0'). então, na hora de ler do txt, ele vai ler as 9 primeras posicoes da data e vai adicionar o '\ 0'. quando for pra ler a hora, ele continua de onde parou e vai ler o ultimo caracter da data ate a quebra de linha.

se você declarar a data com 11 posicoes (e mandar ler 11 com o fgets()), isso deve ser resolvido.

entretanto, pelo q entendi, o txt ta separado em linhas. e isso pode atrapalhar tb.

não fiz o teste aqui, mas tb, se não me engano, a quebra de linha é adicionada na string com o fgets(). e se você estiver usando windows, imagino q ele va adicionar os dois caracteres CR e LF. por conta disso, acho q o melhor seria declarar a data com 13 posicoes (e mandar ler 13 com o fgets()).

tente ai.

estranhamente, declarando a data como 10 e lendo como 14 ele funciona de forma correta, enfim não tenho muito tempo para estudar melhor esta cituacao pois o trabalho é para quinta feira, então apos eu acaba-lo vou verificar essa situacao melhor e se encontrar uma explicacao certa eu posto aki.

quanto ao fgets o que sei é:

A função FGETS lê uma linha inteira de uma vez.

Exemplo: result = fgets(Linha, 100, arq); // o 'fgets' lê até 99 caracteres ou até o '\n'

Se a função for executada com sucesso, fgets retorna o endereço da string lida, caso contrário retorna NULL.

Editado por Pexera
Link para o comentário
Compartilhar em outros sites

  • 0

problema novo, estou com problemas com meus ponteiros

não consigo fazer com que as structs da main que estao sendo passadas por parametros recebam os valores que são colocados nelas nas funcoes internas.

Tanto na funcao insere_evento_arquivo ou na funcao insere_evento_tela

estrutura.h

#ifndef _ESTRUTURA_H
#define _ESTRUTURA_H

#define TAM_CHAR 50

struct evento{
       char nome[TAM_CHAR];
       char data[10];
       char hora[15]; 
       char local[TAM_CHAR];
       struct evento *prox;
       struct evento *ant;
};

typedef struct evento EVENTO;

void insere_evento(EVENTO *evento,EVENTO *inicio);
void insere_evento_arquivo(EVENTO *evento,EVENTO *inicio);
void insere_evento_tela(EVENTO *evento,EVENTO *inicio,char nome[TAM_CHAR], char data[10], char hora[15], char local[TAM_CHAR]);


void altera_evento(char nome[TAM_CHAR]); //- se altera mês deve trocar a posição na lista de meses
void remove_evento(char nome[TAM_CHAR]);
void consulta_evento_nome(char nome[TAM_CHAR]); // Saida: datadia, datames, dataano, horário, local);
void consulta_evento_data(int data_dia,int data_mes,int data_ano); // S: lista_eventos exibir em ordem cronológica de data
void consulta_eventos_mes(int data_mes); // S: lista_eventos);
void consulta_eventos(); //S: todos lista_eventos)- em ordem de data ou alfabética pelo nome do evento, ou por outro critério de ordenação à escolha
void consulta_eventos_recentes(); //S:cinco últimos eventos manipulados:evento inserido ou alterado (usar fila circular)
void menu();
void chama_funcao(int opcao,EVENTO *evento,EVENTO *inicio);

#endif
main.c
#include <stdio.h>
#include <stdlib.h>
#include "estrutura.h"
    
int main(){    
    EVENTO *evento;
    EVENTO *inicio;
    int opcao = 1;
    
    inicio=NULL;
    while(opcao !=0){          
          menu();
          scanf("%d",&opcao);
          chama_funcao(opcao,evento,inicio);
    }        
    printf("\n\n");
    system("PAUSE");    
    return 0;
}
estrutura.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "estrutura.h"

void insere_evento(EVENTO *evento,EVENTO *inicio){
     int opcao=1;
     char nome[TAM_CHAR],data[10],hora[15],local[TAM_CHAR];
     
     printf("\n1 - Arquivo\n2 - Tela\n0 - Retorna\n"); 
     scanf("%d",&opcao);
     switch(opcao){
           case 0: break;        
           case 1: insere_evento_arquivo(evento,inicio);
                   break;                  
           case 2: printf("\nNome do evento: "); 
                   scanf("%s",&nome);
                   
                   if(inicio != NULL){
                      printf("\ninicio não nulo: ");       
                      evento = inicio;       
                      while(evento->prox != NULL){
                            if(strcmp(evento->nome,nome) == 0){
                               printf("\nEvento já esta cadastrado para o dia %s ",evento->data);                           
                               return;
                            }         
                            evento = evento->prox;
                      }
                   }
                   printf("\nData: "); 
                   scanf("%s",&data);
                   printf("\nHora: "); 
                   scanf("%s",&hora);
                   printf("\nLocal: "); 
                   scanf("%s",&local);
                   insere_evento_tela(evento,inicio,nome,data,hora,local);
                   break;                  
           default: printf("\nOpcao incorreta!\n");
                    break;
     }           
}
/* -------------------------------------------------------------------------- */
void insere_evento_arquivo(EVENTO *evento,EVENTO *inicio){
     FILE *arq;
     char arqStr[50],linha[TAM_CHAR];
     int i = 0, duplicados = 0;
     EVENTO *atual = inicio;
     EVENTO *aux = NULL;
     
     fflush(stdin);
     printf("Digite o nome do arquivo:\n");
     //scanf("%s", arqStr);
     
     if ((arq = fopen("agenda.txt" /*arqStr*/,"r")) == NULL){
       fprintf(stderr, "Problema encontrado na abertura do arquivo!");
       exit(-1);
     }
       
     while(!feof(arq)){         
           evento=(EVENTO*)malloc(sizeof(EVENTO));
           evento->ant=NULL;
           evento->prox=NULL;
           atual = inicio;
           if(inicio == NULL){
              i++;
              fgets(evento->nome,TAM_CHAR,arq);
              fgets(evento->data,14,arq);
              fgets(evento->hora,15,arq);
              fgets(evento->local,TAM_CHAR,arq);              
              inicio = evento;
           }
           else{
                //move para o ultimo registro da lista
                while(atual->prox != NULL){
                      atual = atual->prox;
                                             
                }
                i++;
                fgets(evento->nome,TAM_CHAR,arq);
                fgets(evento->data,14,arq);
                fgets(evento->hora,15,arq);
                fgets(evento->local,TAM_CHAR,arq);       
                evento->ant = atual;
                atual->prox = evento;                     
           }

     }
     fclose(arq);
     printf("\nTotal de eventos importados: %d\n", i);
     printf("\nTotal de eventos duplicados e não importados: %d\n", duplicados);
     system("pause");
     return;
}
/* -------------------------------------------------------------------------- */
void insere_evento_tela(EVENTO *evento,EVENTO *inicio,char nome[TAM_CHAR], char data[10], char hora[15], char local[TAM_CHAR]){
     EVENTO *atual = inicio;
                
     evento=(EVENTO*)malloc(sizeof(EVENTO));
     evento->ant=NULL;
     evento->prox=NULL;
     atual = inicio;
     if(inicio == NULL){              
        strcpy(evento->nome, nome);
        strcpy(evento->data, data);
        strcpy(evento->hora, hora);
        strcpy(evento->local, local);
        printf("\ninicio inicializando");
              system("pause");
        *inicio = *evento;
         printf("\ninicio inicializando");
              system("pause");
       }
     else{
          //move para o ultimo registro da lista
          while(atual->prox != NULL){
                atual = atual->prox;
                                       
          }
          strcpy(evento->nome, nome);
          strcpy(evento->data, data);
          strcpy(evento->hora, hora);
          strcpy(evento->local, local);      
          evento->ant = atual;
          atual->prox = evento;       
                         
                printf("\nlinha : %s", evento->nome);
                printf("\nlinha : %s", evento->data);
                printf("\nlinha : %s",  evento->hora);
                printf("\nlinha : %s", evento->local);            
     }
     printf("\nTotal de eventos duplicados e não importados: %d\n");
     return;
}
/* -------------------------------------------------------------------------- */
void menu(){
     system("cls");
     printf("========================== Agenda Cultural ==========================\n");
     printf("\n1 - Insere novo evento");
     printf("\n2 - Altera evento");
     printf("\n3 - Exclui evento");
     printf("\n4 - Consulta evento por nome");
     printf("\n5 - Consulta evento por data");
     printf("\n6 - Consulta evento por mes");
     printf("\n7 - Lista todos os eventos");
     printf("\n8 - Lista 5 ultimos eventos. (cadastrados/alterados)");
     printf("\n0 - SAIR\n");
}
/* -------------------------------------------------------------------------- */
void chama_funcao(int opcao,EVENTO *evento,EVENTO *inicio){
     switch(opcao){
           case 0: break;        
           case 1: insere_evento(evento,inicio);
                   break;                  
           case 2: 
                   break;                  
           case 3: 
                   break;                  
           case 4: 
                   break;                  
           case 5: 
                   break;                  
           case 6: 
                   break;                  
           case 7: 
                   break;                  
           case 8:
                   break; 
           default: printf("\nOpcao incorreta!\n");
                    system("pause");
                    break;
     } 
 }   
/* -------------------------------------------------------------------------- */

Link para o comentário
Compartilhar em outros sites

  • 0

e mais um erro novo, depois de muito mudar e melhorar o programa...

na funcao "insere_novo", em qualuqer tentativa de utilizacao da struct lista o programa trava a execucao.... n sei masi o que fzer =/ esse trabalho tenho que entregar nesta quinta a noite =/

segue os fontes...

estrutura.h

#ifndef _ESTRUTURA_
#define _ESTRUTURA_H

#define TAM_CHAR 50

struct evento{
       char nome[TAM_CHAR];
       char data[10];
       char hora[15]; 
       char local[TAM_CHAR];
       struct evento *prox;
       struct evento *ant;
};

typedef struct evento EVENTO;

//Funcoes ok
void insere_evento(EVENTO **evento,EVENTO **inicio,EVENTO *meses[12]);
void insere_evento_arquivo(EVENTO **evento,EVENTO **inicio,EVENTO *meses[12]);
void menu(); //exibe o menu de opcoes na tela
void mostra_lista(EVENTO *meses[12]); //Imprime a lista na tela
int consulta_dado(EVENTO *lista,char nome[TAM_CHAR]); //verifica se um determinado elemento já esta na lista
int verifica_vazio(EVENTO* lista);//Verifica se a lista esta vazia.(1 = Vazio - 0 = Com dados)

//funcao insere_novo so insere no final ate o momento
void insere_novo(EVENTO *meses[12], char nome[TAM_CHAR], char data[10], char hora[15], char local[TAM_CHAR]); //Insere um novo elemento na lista ordenado por data
//Fim funcoes ok


//fubncoes para implementar
void altera_evento(char nome[TAM_CHAR]); //- se altera mês deve trocar a posição na lista de meses
void remove_evento(char nome[TAM_CHAR]);
void consulta_evento_nome(char nome[TAM_CHAR]); // Saida: datadia, datames, dataano, horário, local);
void consulta_evento_data(int data_dia,int data_mes,int data_ano); // S: lista_eventos exibir em ordem cronológica de data
void consulta_eventos_mes(int data_mes); // S: lista_eventos);
void consulta_eventos(); //S: todos lista_eventos)- em ordem de data ou alfabética pelo nome do evento, ou por outro critério de ordenação à escolha
void consulta_eventos_recentes(); //S:cinco últimos eventos manipulados:evento inserido ou alterado (usar fila circular)


#endif
main.c
#include <stdio.h>
#include <stdlib.h>
#include "estrutura.h"
    
int main(){    
    EVENTO *evento = NULL;
    EVENTO *inicio = NULL;
    EVENTO *meses[12];
    int opcao=1,i=0;
    
    
    
    for(i=0;i<12;i++) meses[i] = NULL;              
    while(opcao !=0){          
         menu();
         scanf("%d",&opcao);
         //chama_funcao(opcao,&evento,&inicio,&meses);
         switch(opcao){
               case 0: break;        
               case 1: insere_evento(&evento,&inicio,meses);
                       system("pause"); 
                       break;                  
               case 2: 
                       system("pause");
                       break;                  
               case 3: 
                       system("pause");
                       break;                  
               case 4: 
                       system("pause");
                       break;                  
               case 5: 
                       system("pause");
                       break;                  
               case 6: 
                       system("pause");
                       break;                  
               case 7: 
                       system("pause");
                       break;                  
               case 8:
                       system("pause");
                       break; 
               default: printf("\nOpcao incorreta!\n");
                        system("pause");
                        break;
         }
         mostra_lista(meses);
         //não esta inseridno masi eventos
    }        
    printf("\n\n");
    system("PAUSE");    
    return 0;
}
estrutura.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "estrutura.h"

void insere_evento(EVENTO **evento,EVENTO **inicio,EVENTO *meses[12]){   
     int opcao=1;
     char nome[TAM_CHAR],data[10],hora[15],local[TAM_CHAR];
     printf("\n1 - Arquivo\n2 - Tela\n0 - Retorna\n"); 
     scanf("%d",&opcao);
     switch(opcao){
           case 0: break;        
           case 1: insere_evento_arquivo(&*evento,&*inicio,meses);
                   break;                  
           case 2: printf("\nNome do evento: "); 
                   scanf("%s",&nome);                   
                   if((verifica_vazio(*evento)) == 0){
                      if((consulta_dado(*evento,nome)) == 0){
                         printf("\nEvento já esta cadastrado!\n");   
                         return;
                         }
                   }
                   printf("\nData: "); 
                   scanf("%s",&data);
                   printf("\nHora: "); 
                   scanf("%s",&hora);
                   printf("\nLocal: "); 
                   scanf("%s",&local);
                   //aquiii
                   //*evento = insere_novo(*evento,meses,nome,data,hora,local);
                   if((verifica_vazio(*inicio) != 0)){
                       *inicio = *evento;        
                   }
                   break;                  
           default: printf("\nOpcao incorreta!\n");
                    break;
     }   
}
/* -------------------------------------------------------------------------- */
void insere_evento_arquivo(EVENTO **evento,EVENTO **inicio,EVENTO *meses[12]){
     FILE *arq;     
     char arqStr[50],linha[TAM_CHAR];
     char nome[TAM_CHAR],data[10],hora[15],local[TAM_CHAR];
     int i = 0, duplicados = 0,aux=0,mes=0;
        
     fflush(stdin);
     printf("Digite o nome do arquivo:\n");
     scanf("%s", arqStr);
     
     if ((arq = fopen(arqStr,"r")) == NULL){
        fprintf(stderr, "Problema encontrado na abertura do arquivo!\n");
        system("pause");
        exit(-1);
     }
     while(!feof(arq)){ 
           i++;
           fgets(nome,TAM_CHAR,arq);
           fgets(data,14,arq);
           fgets(hora,15,arq);
           fgets(local,TAM_CHAR,arq);                            
           
           sscanf(data,"%d/%d/%d",&aux,&mes,&aux);
           /*if((verifica_vazio(meses[mes])) == 0){
              if((consulta_dado(meses[mes],nome)) == 0){  
                 duplicados ++;
                 i--;
                 continue;
                 }
           } */ 
           insere_novo(meses,nome,data,hora,local); 
     }
     fclose(arq);
     printf("\nTotal de eventos importados: %d\n", i);
     printf("\nTotal de eventos duplicados e não importados: %d\n", duplicados);
}
/* -------------------------------------------------------------------------- */
void menu(){
     system("cls");
     printf("========================== Agenda Cultural ==========================\n");
     printf("\n1 - Insere novo evento");
     printf("\n2 - Altera evento");
     printf("\n3 - Exclui evento");
     printf("\n4 - Consulta evento por nome");
     printf("\n5 - Consulta evento por data");
     printf("\n6 - Consulta evento por mes");
     printf("\n7 - Lista todos os eventos");
     printf("\n8 - Lista 5 ultimos eventos. (cadastrados/alterados)");
     printf("\n0 - SAIR\n");
}
/* -------------------------------------------------------------------------- */ 
void insere_novo(EVENTO *meses[12], char nome[TAM_CHAR], char data[10], char hora[15], char local[TAM_CHAR]){
        EVENTO *novo = (EVENTO*) malloc (sizeof(EVENTO));
        EVENTO *lista = NULL;
        int dia=0,mes=0,ano=0;
        strcpy(novo->nome,nome);
        strcpy(novo->data,data);
        strcpy(novo->hora,hora);
        strcpy(novo->local,local);
        
        sscanf(data,"%d/%d/%d",&dia,&mes,&ano);
        *lista = *meses[mes];
        //move para o ultimo registro da lista
        printf("\ninsere\n");
        if((verifica_vazio(lista)) == 0){  
                                   printf("\ndentro\n");      
            while(lista->prox != NULL){
                              printf("\ndentro while\n");
                  lista = lista->prox;
                  printf("\n- SAIR\n");
            }
            printf("\n1 - SAIR\n");
            lista->prox = novo;
            novo->prox = NULL;
            novo->ant = lista;
        }
        else{ 
             novo->prox = NULL;
             novo->ant = NULL;             
             meses[mes-1] = novo;;
        }
}
/* -------------------------------------------------------------------------- */ 
void mostra_lista(EVENTO *meses[12]){
     EVENTO*mostra; 
     int i=0;
     /*for(i=0;i<12;i++) printf("\nmeses[%d] = %d",i,meses[i]);
     system("pause");*/
     for(i=0;i<12;i++){
        //for(mostra = meses[i]; mostra->prox != NULL; mostra = mostra->prox){
        mostra = meses[i];
        if((verifica_vazio(mostra)) == 0){
            printf("\nmeses[%d] = %d",meses[i],mostra->prox);             
            for(mostra = meses[i]; mostra->prox != NULL; mostra = mostra->prox){
                printf("\n====================\n");
                printf("Evento = %s\n", mostra->nome);
                printf("Data = %s\n", mostra->data);
                printf("Hora = %s\n", mostra->hora);
                printf("Local = %s\n", mostra->local);
                printf("\n====================\n");
            }
            system("pause");
        }
        else
         printf("\nNao existem eventos para o mes %d!\n", i+1);
     }
}
/* -------------------------------------------------------------------------- */
int verifica_vazio(EVENTO* lista){
    return (lista == NULL);
}
/* -------------------------------------------------------------------------- */
int consulta_dado(EVENTO* lista,char nome[TAM_CHAR]){   
    EVENTO*mostra;  
    for(mostra = lista; mostra != NULL; mostra = mostra->prox){
        if(strcmp(lista->nome,nome) == 0){                            
           return 0;
        }         
        lista = lista->prox;
    }
    return 1;
}
/* -------------------------------------------------------------------------- */

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...