Validação de Login usando arquivo binário de Dados em C

Bom domingo Pessoal,

Estou com um pequeno problema no meu código para validação de login.
Vou explicar melhor:
Tenho um janela Java que grava em um arquivo Binário com extensão .docx chamado login o meu usúario e senha assim LOGIN = SENHA ;
Tenho um código em C que recupera normalmente esse usuário e senha, a gravação está OK.

Depois em C tenho um código que faz a comparação desse login com o meu usuário cadastrado, caso forem o mesmo ele cópia o registro do usuário inteiro para um outro arquivo.
O código é esse abaixo…
O grande problema é que após o fread minha variavel Auxiliar do tipo usuario está retornando vazio.

[code]#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include “MinhaBiblioteca.h”

main()
{
usuario dados, auxiliar;
FILE *arquivoUsuario, *arquivoComparacao, *arquivoResposta;
char caractere, usuario[8] ="", senha[10]="";
int i;

arquivoComparacao = fopen(“C:/Alexandria/ArquivoTemporario/login.docx”,“rb”);

if(arquivoComparacao == NULL)
{
printf("\nARQUIVO NAO EXISTE… INFORME O LOGIN!");
fclose(arquivoComparacao);
exit(1);
}

while (!feof(arquivoComparacao))
{
// Recuperando o valor do campo "usuario"
i = 0;
do
{
caractere = fgetc(arquivoComparacao);

        if (caractere != '=' && !feof(arquivoComparacao))
        {
            usuario[i] = caractere; 
            i++;
        }
     } while (caractere != '=' && !feof(arquivoComparacao));

     // Recuperando o valor do campo "senha"
     i = 0;
     do
     {
        caractere = fgetc(arquivoComparacao);
        
        if (caractere != ';' && !feof(arquivoComparacao))
        {
            senha[i] = caractere; 
            i++;
        }
     } while (caractere != ';' && !feof(arquivoComparacao));

}

strcpy(dados.login, usuario);
strcpy(dados.senha, senha);

//printf("\n\n## USUARIO E SENHA ## %s e %s", dados.login, dados.senha);

arquivoResposta = fopen(“C:/Alexandria/ArquivoTemporario/Usuarios.docx”,“wb”);

arquivoUsuario = fopen(“C:/Alexandria/ArquivoPrincipal/Usuarios.docx”,“rb”);

if(arquivoUsuario == NULL)
{
printf(“Arquivo é NULL”);
fclose(arquivoComparacao);
fclose(arquivoUsuario);
fclose(arquivoResposta);
exit(1);
}

fseek(arquivoUsuario,0*sizeof(usuario),SEEK_SET);

do
{
fread(&auxiliar,sizeof(usuario),1,arquivoUsuario);

     if(strcmp(auxiliar.login, dados.login) == 0 && !feof(arquivoUsuario))
     {                      
        if(strcmp(auxiliar.senha, dados.senha) == 0 && !feof(arquivoUsuario))
        {
           fwrite(&auxiliar,sizeof(usuario),1,arquivoResposta);
           printf("\nCOMPARACAO OK!");
           break;// depois que achar interrompe a busca
        }   
     }

}while(!feof(arquivoUsuario));

if(!feof(arquivoUsuario))
{
printf(“REGISTRO NAO EXISTE…”);
}

printf("\nFINALIZANDO LOGIN… !");

fclose(arquivoUsuario);
fclose(arquivoComparacao);
fclose(arquivoResposta);

getchar();

}
[/code]

Vou aguardar um resposta pessoal…
Obrigada!

Desculpe, mas não entendi qual é a sua dúvida. Poderia explicar melhor?

Obs: você não acha que seria melhor trabalhar com arquivos de texto puro, o txt?

[quote=Andre Rosa]Desculpe, mas não entendi qual é a sua dúvida. Poderia explicar melhor?

Obs: você não acha que seria melhor trabalhar com arquivos de texto puro, o txt?[/quote]

Oi Andre,

Pois é, seria BEM melhor, porém este meu projeto é da faculdade e é obrigatório que seja em arquivo Binário.

Queria saber se estou usando certo as comparações e a maneira correta se estiver usando errado, pois o usuário e senha são os mesmo, mas meu auxiliar.login está retornando lixo e pedaços do meu registro em binário que nada tem a ver com o login. =/

Sem você postar o formato do arquivo, fica bem difícil te ajudar.

Como assim formato??

Todos os arquivos estão em formato .docx

Eles são um .docx padrão do Word?

Pensei se tratarem de um arquivo binário, gerado por sua aplicação java. Nesse caso, seria bom você explicar como os dados foram colocados lá dentro, respondendo perguntas como:
Em que ordem os campos foram gravados? E que campos foram gravados?
Como você sabe que uma String acabou e que um outro dado está começando?
Seu texto é armazenado em que codificação (UTF-8? Ascii? Unicode?)
Os dados numéricos são Little Endian ou Big Endian?

Olha, eu estava armazendo em um arquivo txt, só mudei para docx porque é binário, to escrevendo normal, a ordem de escrita é a ordem da minha struct:

typedef struct { int codigo; //gerar automaticamente sequencial char nome[40]; char curso[30]; char matricula[10]; char login[8]; //no máximo 8 caracteres, tratar campo char senha[10]; char tipo[20]; char status[15]; }usuario;

Não to códificando para nada antes de escrever…
Não estou colocando nada pra separa um campo do outro.

Esse é meu método para inserir Novos Usuário, mas foram disso eu tenho este mesmo arquivo sem os prints sendo chamado pelo runtime em java para testes.

[code]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “MinhaBiblioteca.h”

main()
{
FILE *registro;
usuario dados;

  int ultimoRegistro = 0;
  int primeiroRegistro = 0;
  
  if((registro = fopen("C:/Alexandria/ArquivoPrincipal/Usuarios.txt","rt+")) == NULL)
  {
               printf("\n#### ARQUIVO NAO EXISTE E SERA CRIADO NESTE MOMENTO... ");
               registro = fopen("C:/Alexandria/ArquivoPrincipal/Usuarios.txt","wt+");
               primeiroRegistro = 1;//indica que este será o primeiro registro a ser gravado
  }
  else
  {
               fseek(registro,-1*sizeof(usuario),SEEK_END); //posiciona no final do arquivo e volta um registro com o -1
               fread(&dados,sizeof(usuario),1,registro); //le um registro
               ultimoRegistro = dados.codigo;   //a variavel recebe o ultimo código cadastrado
               printf("\n\nULTIMO CODIGO: %d", ultimoRegistro);        
               ultimoRegistro = ultimoRegistro + 1;
  }

  if(primeiroRegistro == 1)
  {
              printf("\n\nINSERIR UM NOVO USUARIO");
              dados.codigo = primeiroRegistro;
              printf("\n\nCODIGO: %d", dados.codigo);
              getchar();
  }
  else
  {
              printf("\n\nINSERIR UM NOVO USUARIO");
              dados.codigo = ultimoRegistro;
              printf("\n\nCODIGO: %d", dados.codigo); 
              getchar();
  }
  
  printf("\nINFORME O NOME: ");
  scanf("%[A-Z a-z]", dados.nome);
  getchar();
  
  printf("\nINFORME O CURSO\n\nCiencia da Computacao\nHistoria\nArquitetura\nEngenharia Civil\nPsicologia: ");
  scanf("%[A-Z a-z]", dados.curso);
  getchar();
  
  printf("\nINFORME A MATRICULA: ");
  scanf("%d", &dados.matricula);
  getchar();
  
  system("cls");
  
  printf("\nINFORMA O LOGIN: ");
  scanf("%[A-Z a-z]", dados.login);
  getchar();
  
  printf("\nINFORME A SENHA: ");
  scanf("%[A-Z a-z 0-9]", dados.senha);
  getchar();
  
  printf("\nINFORME O TIPO DE USUARIO\nAdministrador\nBibliotecario\nPesquisador: ");
  scanf("%[A-Z a-z]", dados.tipo);
  fflush(stdin);              //devolve o teclado para o programa
  
  strcpy(dados.status, "Ativo");
          
  fseek(registro,0*sizeof(usuario), SEEK_END); //posiciona na marca de final do arquivo e salta 0 bytes, pois gravação deve ser feita no final do arquivo
  fwrite(&dados,sizeof(usuario),1,registro);   //escreva do buffer de dados da memória

  if (registro != NULL)
       fclose(registro);

  getchar();

}
[/code]

Obrigada pela paciência!

Por que no seu fseek você fez 0*sizeof(usuario)? Isso sempre retornará 0.
É isso mesmo que você quer, posicionar o arquivo no início (me parece que sim, mas é desnecessário fazer um seek para o início num arquivo recém aberto)?

Outra coisa, no seu código de gravação o arquivo é chamado Usuarios.txt e no de leitura Usuarios.docx. Isso está certo? O arquivo realmente existe?

Sim, todos os arquivos existem, é que fiz alteração como eu disse do código para .docx denovo, só não coloquei alterado.

Foi mal… olha esse agora.

É o seguinte, to querendo deixar de usar essa arquitetura de gravação ai pra esssa, vou explicar passo a passo pra melhorar pra você compreender.

O projeto é uma biblioteca. De início para cadastrar um novo usuário java lê os dados dos campos do JFrame e concatena em uma string só e grava em um arquivo .txt.
Segue o código:

CHAMADA:

escreveArquivoDisco("C:/Alexandria/ArquivoTemporario/Usuarios.docx"); new Runtime_UsuarioInserir();

MÉTODO:

[code] public void escreveArquivoDisco(String nomeArquivo)
{
FileOutputStream arquivo;
PrintStream escritor;
String dados;

        try 
        {               
            arquivo = new FileOutputStream(nomeArquivo);
            escritor = new PrintStream(arquivo);
            
            escritor.print(jtNome.getText()+","
            +jcTipo.getSelectedItem()+"#"+jtMatricula.getText()+","
            +jcCurso.getSelectedItem()+"#"+jtLogin.getText()+","
            +jtSenha.getText()+"#"+jcStatus.getSelectedItem()+";"); //pega dados direto da janela
            
            arquivo.close();   

            JOptionPane.showMessageDialog(null, "Arquivo gerado com sucesso...");
        }

        catch(IOException erro)
        {
            System.out.println("Não foi possível escrever o arquivo no disco..."+erro);
        }
}[/code]

Ok? Tudo bem até aqui?

CODIGO EM C que desconcatena:

[code]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “MinhaBiblioteca.h”

main()
{
FILE *registro, *registroConcatenado;
usuario dados;
char auxiliar[300];
char caractere, usuario[8] = “”, senha[10] = “”, nome[40] = “”, curso[30] = “”, tipo[20] = “”, status[15] = “”, matricula[10] = “”;
int i, primeiroRegistro = 0, ultimoRegistro = 0;

  registroConcatenado = fopen("C:/Alexandria/ArquivoTemporario/Usuarios.docx","rb");

  if(registroConcatenado == NULL)
  {
      printf("ARQUIVO DE DADOS DO USUARIO NAO EXISTE....");
      fclose(registroConcatenado);
      exit(1);
  }
  
  fseek(registroConcatenado, 0, SEEK_SET);

  //Início do método para recuperar informações gravadas em arquivo .docx
  
                  //Recuperando o valor do campo "usuario"
                  i = 0;
                  do
                  {
                        caractere = fgetc(registroConcatenado);
        
                         if (caractere != ',' && !feof(registroConcatenado))
                         {
                                       nome[i] = caractere; 
                                       i++;
                         }
                  }while(caractere != ',' && !feof(registroConcatenado));
                  
                  nome[i+1] = '\0';
                  //printf("#\nDADO: %s\n", nome);
                  
                  //Recuperando o valor do campo "tipo"
                  i = 0;
                  do
                  {
                        caractere = fgetc(registroConcatenado);
        
                        if (caractere != '#' && !feof(registroConcatenado))
                        {
                                      tipo[i] = caractere; 
                                      i++;
                        }
                  } while (caractere != '#' && !feof(registroConcatenado)); 
                     
                  tipo[i+1] = '\0';   
                  //printf("DADO: %s\n", tipo);     
                  
                  
                  //Recuperando o valor do campo "matricula"
                  i = 0;
                  do
                  {
                        caractere = fgetc(registroConcatenado);
        
                         if (caractere != ',' && !feof(registroConcatenado))
                         {
                                       matricula[i] = caractere; 
                                       i++;
                         }
                  }while(caractere != ',' && !feof(registroConcatenado));
                  
                  matricula[i+1] = '\0';
                  //printf("DADO: %s\n", matricula);
                  
                  //Recuperando o valor do campo "curso"
                  i = 0;
                  do
                  {
                        caractere = fgetc(registroConcatenado);
        
                        if (caractere != '#' && !feof(registroConcatenado))
                        {
                                      curso[i] = caractere; 
                                      i++;
                        }
                  } while (caractere != '#' && !feof(registroConcatenado)); 
                     
                  curso[i+1] = '\0';   
                  //printf("DADO: %s\n", curso); 
                  
                  //Recuperando o valor do campo "usuario"
                  i = 0;
                  do
                  {
                        caractere = fgetc(registroConcatenado);
        
                         if (caractere != ',' && !feof(registroConcatenado))
                         {
                                       usuario[i] = caractere; 
                                       i++;
                         }
                  }while(caractere != ',' && !feof(registroConcatenado));
                  
                  usuario[i+1] = '\0';
                  //printf("DADO: %s\n", usuario);
                  
                  //Recuperando o valor do campo "senha"
                  i = 0;
                  do
                  {
                        caractere = fgetc(registroConcatenado);
        
                        if (caractere != '#' && !feof(registroConcatenado))
                        {
                                      senha[i] = caractere; 
                                      i++;
                        }
                  } while (caractere != '#' && !feof(registroConcatenado)); 
                     
                  senha[i+1] = '\0';   
                  //printf("DADO: %s\n", senha); 
                  
                  //Recuperando o valor do campo "status"
                  i = 0;
                  do
                  {
                        caractere = fgetc(registroConcatenado);
        
                         if (caractere != ';' && !feof(registroConcatenado))
                         {
                                       status[i] = caractere; 
                                       i++;
                         }
                  }while(caractere != ';' && !feof(registroConcatenado));
                  
                  status[i+1] = '\0';
                  //printf("DADO: %s\n", status);
  
  registro = fopen("C:/Alexandria/ArquivoPrincipal/Usuarios.docx","rb+");
  
  if((registro) == NULL)
  {
               registro = fopen("C:/Alexandria/ArquivoPrincipal/Usuarios.docx","wb+");
               primeiroRegistro = 1;//indica que este será o primeiro registro a ser gravado
  }
  else
  {
               fseek(registro,-1*sizeof(usuario),SEEK_END); //posiciona no final do arquivo e volta um registro com o -1
               fread(&dados,sizeof(usuario),1,registro); //le um registro
               ultimoRegistro = dados.codigo;   //a variavel recebe o ultimo código cadastrado      
               ultimoRegistro = ultimoRegistro + 1;
  }

  if(primeiroRegistro == 1)
  {
              dados.codigo = primeiroRegistro;
  }
  else
  {
              dados.codigo = ultimoRegistro;
  }
  
  strcpy(dados.nome, nome);
  strcpy(dados.tipo, tipo);
  strcpy(dados.matricula, matricula);
  strcpy(dados.curso, curso);
  strcpy(dados.login, usuario);
  strcpy(dados.senha, senha);
  strcpy(dados.status, status);
  
  fseek(registro,0*sizeof(usuario),SEEK_END);
  
  fwrite(&dados,sizeof(usuario),1,registro);
  
  printf("\n\n## CHEGOU AO FIM DO ARQUIVO! ##");
  
  fclose(registroConcatenado);
  fclose(registro);
  
  getchar();

}
[/code]

No código em C a ordem de gravação foi a mesma da struct postada no outro comentário.
Porém o usuário não informa o código, ele é gerado automáticamente no código.

Qualquer dúvida é só postar!
Obrigada…

Pessoal, mudei muitas coisas no meu projeto inclusive o formato de gravação que passou de .docx para .dad e a validação do login resolvi fazer em XML, achei mais fácil pois já era um dos requisitos do projeto.

Se alguém precisar de algo parecido é só me falar…

Obrigada pela ajuda pessoal.

:wink: