Ir ao conteúdo
  • Cadastre-se

C Ordenação de struct dentro de um arquivo


Brunno 633

Posts recomendados

Olá estou com um trabalho da faculdade para fazer porém não consigo ordenar em ordem alfabética uma struct que está armazenada em um arquivo.dat.

Preciso ordenar o arquivo para depois realizar uma busca binária para autenticar o login dos usuários no sistema. Alguém por favor pode me ajudar nessa ordenação o mais rápido possível?

 

Segue o meu código abaixo:

=============================================================================================

/* Bibliotecas */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#include <string.h>
#include <ctype.h>

/* Tipos pré-definidos (definição dos registros) */

typedef    struct              
{
    char   nome[45];
    char   prontuario[10];   
} reg;


//VARIÁVEIS GLOBAIS
reg usuario[75];
int tamanho; //para passar como parametro na ordenação (tamanho do vetor de struct = 75)


/* Protótipos de funções */
void    insertionSort (reg *usuario, int tamanho);
void    captura_usuario(void);    
void    grava_usuario(void);    
void    cadastra_usuario(void);    
void    consulta_usuario(void); 
void    admin (void);

/* Construçao das funçoes */

void insertionSort (reg *usuario, int tamanho)      //tamanho = 75
{
    int i, j;
    reg aux;
    
    FILE *Arq;
    FILE *Arqtemp;
    
    Arq = fopen("USUARIOS.DAT","r");
    
    for (i=0; i<tamanho; i++)
    {
        fgets (usuario.nome,45,Arq);
        fgets (usuario.prontuario,10,Arq);
    }
    
    //criando outro arquivo para ordenar
    Arqtemp = fopen("USUARIOSORD.DAT","w");
    
    //ordenando as informações do arquivo
    
    /*
        saída strcmp(str1,str2)
        ==0 : str1 igual a str2
        > 0 : str1 vem depois que str2 (str1 é maior que str2)
        < 0 : str1 vem antes que str2 (str1 é menor que str2)
    */
    
    //INSERTION SORT
    for (i = 1; i < 75; i++)
    {
        aux = usuario;
        for (j=i; (j>0) && (strcmp (aux.nome, usuario[j-1].nome)<0); j--)
        {
            usuario[j] = usuario[j-1];    
        }
        usuario[j] = aux;
        
    }
   

    fclose (Arqtemp);
    fclose (Arq);
    
    /* Deleta o .DAT */
    system ("DEL  USUARIOS.DAT");
    /* Renomeia o arquivo ordenado para .DAT */
    system ("REN  USUARIOSORD.DAT USUARIOS.DAT");
}

 

void captura_usuario (void)
{
    int    indice;
    int i;
    char resp;
    
    for(i=0; resp != 'n' && resp != 'N'; i++)
    {
        system ("cls");    
        printf ("\nNome: ");
        fflush (stdin);
        gets(usuario.nome);
        _strupr(usuario.nome);
        
        printf ("\nProntuário: ");
        fflush (stdin);
        gets(usuario.prontuario);
        _strupr(usuario.prontuario);
        
        printf ("Quer registrar outro usuário?");
        fflush (stdin);
        resp = getche();
    }
}    

void    grava_usuario(void)
{
  char resposta;
  FILE *Arq;
  /* Verifica se é para gravar ou não */
    printf ("\n ================================================");
    printf ("\n Deseja gravar este registro? [n/N = nao]");
    fflush (stdin); 
    resposta = getche();
    /* se deseja gravar... (resposta != não) */    
    if ( resposta != 'n' && resposta != 'N' ) /* ... para gravar */
    {
        Arq = fopen ( "USUARIOS.DAT" , "a" );   /* Abro o arquivo */
        fflush (stdin);
        fwrite ( &usuario , sizeof(usuario), 1, Arq);   /* grava no arquivo */
        fclose (Arq);  /* Fecha o arquivo */
    }
}

void  cadastra_usuario ( void )         
{
    captura_usuario();
    grava_usuario();
}

void consulta_usuario(void)
{
  insertionSort (usuario, 75);   //EU ESTOU EM DÚVIDA DE COLOCAR A FUNÇÃO DE ORDENAÇÃO, NÃO SEI SE É AQUI MESMO
  
  FILE *Arq;
  int i;
  
  Arq = fopen ( "USUARIOS.DAT" , "r" );   /* abrir arquivo */
  while ( !feof(Arq) ) /* enquanto não for fim do arquivo...*/
  {
       fread ( &usuario, sizeof(usuario), 1, Arq); /*...lê e...*/
       

       if ( !feof(Arq) )
       {
            for(i=0; i<75; i++)
            {
            printf ("\n %5s \t %5s",usuario.prontuario,usuario.nome);    
            }
       }        
  }
  fclose (Arq);/* fecha arquivo */
    getch();
}

void    admin (void)
{   
  char  opc;
  do
  {
    /* Captura a opção desejada */    
        do
    {   system ("cls");
        printf ("\n=================== SISTEMA GERENCIADOR DE SUPERMERCADO ==================");
        printf ("\n                    1. Abastecer Gôndolas");
        printf ("\n                    2. Caixa/PDV");
        printf ("\n                    3. Gerenciar usuários");
        printf ("\n                    0. SAIR");    
        printf ("\n==========================================================================");
        printf ("\n                Escolha: "); fflush(stdin); opc = getche();
    }
    while ( opc != '1' && opc != '2' && opc != '3' &&  opc != '0');
    /* dependendo da opção, faz uma das operaçoes */
    switch ( opc )
    {
        case '1' : printf ("Abastecer Gôndolas - Tem que fazer ainda"); getch();                 break;    
        case '2' : printf ("Caixa/PDV - Tem que fazer ainda");         getch();                  break;          
        case '3' :  
                    do
                    {   system ("cls");
                        printf ("\n=================== GERENCIAMENTO DE USUÁRIOS ==================");
                        printf ("\n                    1. Cadastro de usuários");
                        printf ("\n                    2. Consulta de usuários");
                        printf ("\n                    3. Alterar registro de usuário");
                        printf ("\n                    4. Excluir registro de usuário");
                        printf ("\n                    0. VOLTAR");    
                        printf ("\n================================================================");
                        printf ("\n                Escolha: "); fflush(stdin); opc = getche();
                    }
                    while ( opc != '1' && opc != '2' && opc != '0');
                    /* dependendo da opção, faz uma das operaçoes */
                    switch ( opc )
                    {
                        case '1' : cadastra_usuario();                  break;    
                        case '2' : consulta_usuario();                  break;          
                        //case '3' : altera_registro();                   break;
                        //case '4' : deleta_registro();                   break;
                        case '0' : admin();                             break;        
                    } break;                          
        
        case '0' : exit(0); break;        
    } 
 }
 while ( opc != '0');
}

main()
{   
    setlocale (LC_ALL, "");
    admin ();    
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

mano ta meio doido seu codigo você pode fazer sua funcao admin assim 

void admin() {
  int opc;
  int opc2;
      system("cls");
      printf("\n=================== SISTEMA GERENCIADOR DE SUPERMERCADO ==================");
      printf("\n                    1. Abastecer Gôndolas");
      printf("\n                    2. Caixa/PDV");
      printf("\n                    3. Gerenciar usuários");
      printf("\n                    0. SAIR");
      printf("\n==========================================================================");
    switch (opc) {
    case 1:
      printf("Abastecer Gôndolas - Tem que fazer ainda");
      break;
    case 2:
      printf("Caixa/PDV - Tem que fazer ainda");
      break;
    case 3:
        system("cls");
        printf("\n=================== GERENCIAMENTO DE USUÁRIOS ==================");
        printf("\n                    1. Cadastro de usuários");
        printf("\n                    2. Consulta de usuários");
        printf("\n                    3. Alterar registro de usuário");
        printf("\n                    4. Excluir registro de usuário");
        printf("\n                    0. VOLTAR");
        printf("\n================================================================");
    
	  switch (opc2) {
      case 1:
      	system("cls");
        cadastra_usuario();
        break;
      case 2:
      	system("cls");
        consulta_usuario();
        break;
        case 2:
      	altera_registro();
        deleta_registro();
      case 0:
      	system("cls");
        admin();
    }
  }
}

main() {
  setlocale(LC_ALL, "");
  admin();
}

 

adicionado 6 minutos depois

evite usar 2 funçoes em1 tipo captura usuario e guarda usuario. junte as 2 em cadastra usuario 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!