Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Dúvida Struct + Arquivo txt em C

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Dúvida Struct + Arquivo txt em C

    Olá pessoal do fórum,estou fazendo um sistema de venda de passagens de onibus, utilizando structs e salvando em arquivo.txt. A principio está quase pronto o programa, porém estou apenas com dois problemas.

    Opção 2: Cada onibus tem 42 lugares, vamos supor que eu gravo 3 onibus (1-brasil,2-mexico,3-eua), quando seleciono a poltrona "30" do
    onibus 1, meu codigo está replicando para o onibus 2 e 3 também a mesma poltrona, e não deveria.

    Opção 3: Preciso mostrar todos passageiros do onibus que o usuario digitou, porém não está aparecendo.


    Código:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <conio.h>
    
    
    struct rodoviaria
    {
        int codigo,horapartida,poltrona[42];
        char destinoviagem[100],passageiro[100];
        
    };
    
     //função grava
       void grava(struct rodoviaria a[1000],int fim)
      {
          FILE *arq;
          int teste,i;
          arq = fopen("arquivo.txt","wb"); // w = cria arquivo, b = modo binario
           if(arq != NULL)
           {
              for(i=0;i<fim;i++)
              {
                  teste = fwrite(&a[i],sizeof(struct rodoviaria),1,arq);
                  if (teste !=1) // retorna 1 gravou e 0 senao gravou
                  {
                     printf("erro ao salvar"); 
                     getch();                 
                  }
              } 
                fclose(arq);  
           }  
              else 
              {         
                 printf("erro ao abrir arquivo");
              }  
      }       
           
     //função carrega     
     int carrega(struct rodoviaria a[1000]) // abre arquivo e carrega no vetor
     {
        FILE *arq;  
        int teste,percorre=0;
        struct rodoviaria registro;
          
        arq = fopen("arquivo.txt","rb");
        if(arq != NULL)
        {
           while (!feof(arq)) // diferente do fim do arquivo?
           {
                 teste = fread(&registro,sizeof(struct rodoviaria),1,arq);      
                 if (teste ==1) // se conseguiu ler
                 { 
                    a[percorre] = registro;     
                    percorre++;        
                 }
           }    
               fclose(arq);  
               
        }        
          return percorre;
                  
    }          
         
      int main() 
     {
       struct rodoviaria vet[1000];  
       int ultimo=0, op=0,i,j,x,codonibus=0,cont=0,lugar=0,bus=0;    
       char nomedestino[100];
       
       //carrega vet[i].poltrona[i];
        for (i=0;i<42;i++)
        {
            cont++;  
            vet[i].poltrona[i]= cont;
        }
      
                
         while(op !=4)
         {    
               ultimo = carrega(vet); //abre arquivo e carrega para o vetor 
               printf ("======================================MENU======================================\n");
               printf ("1 - Cadastrar viagem :\n");
               printf ("2 - Comprar passagem :\n");
               printf ("3 - Listar Lista de passageiros :\n");
               printf ("4 - Sair :\n\n");
               fflush (stdin);
               scanf ("%d",&op);    
               fflush (stdin);   
    
               if(op==1)
               {
                  printf("Informe Codigo do Onibus:");
                  scanf ("%d",&vet[ultimo].codigo);  
                  printf("Informe Destino de Viagem :");      
                  fflush(stdin);
                  fgets (vet[ultimo].destinoviagem,100,stdin);
                  fflush(stdin);           
                  printf("Informe Horario de Partida da Viagem:");
                  scanf ("%d",&vet[ultimo].horapartida);
                  ultimo++;
                  grava(vet,ultimo); //função para gravar vetor no arquivo .txt
                  printf("\n");
                  printf("Cadastro Realizado com sucesso !\n\n");
                  system("pause");
                  system("CLS");
               }  
                  
         
               if(op==2)
               { 
                  printf("Informe Destino de Viagem :");
                  fflush(stdin);
                  fgets(nomedestino,100,stdin);
                  fflush(stdin);       
                  printf("\n");
                              
                  for(i=0;i<ultimo;i++)        
                  {
                      x = strcmp(vet[i].destinoviagem,nomedestino); 
                      
                      if (x == 0)
                      {
                         printf ("=======================\n");   
                         printf("Codigo do Onibus :%d\n",vet[i].codigo);
                         printf("Horario de Partida :%d\n",vet[i].horapartida);
                         printf("\n");  
                      }
                  }   
                                                           
                  printf("Informe o codigo do onibus desejado:");
                  scanf("%d",&codonibus);  
                  printf("\n");
                   
                  for(i=0;i<ultimo;i++) // laço no arquivo
                  {   
                      if(vet[i].codigo == codonibus) // se codigo do arquivo == codigo digitado
                      {
                          //imprime destino do onibus selecionado.             
                          printf("\tDestino: %s\n",vet[i].destinoviagem);   
                        
                          cont=-1;                    
                          for (i=0;i<42;i++)
                          {      
                              cont++;
                              if(cont == 4)
                              {  
                                printf("\n%d\t",vet[i].poltrona[i]);
                                cont=0;
                              } 
                              else
                              {
                                printf("%d\t",vet[i].poltrona[i]);    
                              }  
                          } 
                      
                          printf("\n\n");   
                          printf("Informe poltrona vaga :");
                          scanf ("%d",&lugar);
                          printf("Informe nome do passageiro:"); 
                          fflush(stdin);
                          fgets (vet[i].passageiro,100,stdin);
                          fflush(stdin);
                          vet[i].passageiro[j+1];
                                               
                          for(i=0;i<42;i++)
                          { 
                             if (vet[i].poltrona[i] == lugar)
                             {                      
                                 vet[i].poltrona[i] = 0;
                             }
                          }
                          grava(vet,i);        
                          printf("\n"); 
                           
                           // lista novamente onibus
                           for (i=0;i<42;i++)
                           {  
                                  cont++;
                                  if(cont == 4)
                                  {  
                                     printf("\n%d\t",vet[i].poltrona[i]);
                                     cont=0;
                                  } 
                                  else
                                  {
                                     printf("%d\t",vet[i].poltrona[i]);    
                                  }  
                           } 
                          
                        }//if  
                      }//for "ultimo"                                
                     
                           
                  printf("\n\n"); 
                  system("pause");
                  system("CLS");    
               }// fim op==2
                              
               if(op==3)
               {
                   if(ultimo == 0)
                   {
                     printf("Nenhum registro foi cadastrado ainda.Favor verificar!\n");
                     printf("\n");          
                     system("pause");
                   }                
                    
                    else 
                    {
                       printf("Informe Destino de Viagem :");
                       fflush(stdin);
                       fgets(nomedestino,100,stdin);
                       fflush(stdin);       
                       printf("\n");
                              
                          for(i=0;i<ultimo;i++)        
                          {
                             x = strcmp(vet[i].destinoviagem,nomedestino); 
                      
                             if (x == 0)
                             {
                                printf ("=======================\n");   
                                printf("Codigo do Onibus :%d\n",vet[i].codigo);
                                printf("\n");  
                             }
                          } 
                        
                          printf("\n");  
                          printf("Informe codigo do onibus:");
                          scanf("%d",&bus);     
                          printf("\n");
                          
                          for(i=0;i<ultimo;i++)
                          { 
                             if(vet[i].codigo == bus)    
                             {  
                                   printf("Passageiros desse onibus: %s\n",vet[i].passageiro);
                                   printf("\n\n\n");  
                             }
                             
                          }   
                      }//else       
                      system("pause");
                      system("CLS");      
                              
               }//fim op ==3         
                      
         
               if(op==4)
               {
                  printf("Encerrando o programa com sucesso!\n\n");
                  system("pause");
                  exit(0);
               }            
         
               
      }//while         
        
                
    }//main

  • Font Size
    #2
    editado errado.

    Comment


    • Font Size
      #3
      Hi !
      Fala amigão, seu código está meio complicado para ser lido, não analisei muito porquê nao estou em casa agora.
      Mas vou tentar deixar algumas dicas para tentar melhorar ele.

      A lógica está meio confusa, você tem uma struct rodoviaria com passageiro, vetor inteiro de poltronas .. Acharia mais interessante, se fosse ser assim .. criar uma struct de um onibus.

      Faça o uso da diretiva #define para limitar um tamanho dos vetores de char no programa, melhora a leitura. Utilizar um typedef também ajuda na declaração da struct.
      Tente 'quebrar' um pouco mais em funções o seu código, tentar tirar todo o enrrosco do main.

      Enfim, vamos a algumas coisas que podem fazer a diferença.
      Como está trabalhando com estruturas, a coisa fica mais crítica .. entram algumas relações com passagem por referência, ponteiros e tudo mais.

      Quando você faz struct rodoviaria[INDICE], isso retorna uma estrutura rodoviaria, vai precisar pegar o endereço dessa entrada, &rodoviaria[INDICE].
      Utilizando o operador ponto (.) você retorna o que seu passageiro é, e de acordo com seu código .. seu passageiro é um char [100].
      É necessario transformar isso de uma array pra uma string em C, basta retornar o primeiro caracter da string.
      &(rodoviaria[INDICE].passageiro[0]), o & apenas retorna o endereço disso.
      Precisa conferir se está tudo salvando corretamente também.

      Nas funções declaradas:
      void grava(struct rodoviaria a[1000],int fim)
      int carrega(struct rodoviaria a[1000])

      Você pode passar como um ponteiro para uma entrada do tipo rodoviária, ou seja, referencia .. ao invés de usar o proprio vetor, que também é algo por referencia por natureza, mas fica a seu critério.

      Percebi que usa varias vezes algo pra listar os onibus, seria interessante automatizar esse pequeno processo.
      E com relação ao erro de estar fazendo a alteração em todos os onibus, veja como eles estão sendo dispostos nos vetores.

      Enfim, ficam algumas dicas para ajuda, não são grandes coisas .. mas ja tive alguns problemas com structs e fica minha dica.
      Caso alguem tenha alguma correção a fazer, fique a vontade.

      []'s

      Comment


      • Font Size
        #4
        Ae, Mack valeu, porque eu também aprendi nesse post.

        Comment

        X
        Working...
        X