Ir ao conteúdo
  • Cadastre-se

C Consulta de Arquivos em C


ngiovana

Posts recomendados

Estou fazendo um trabalho em que tenho que fazer uma struct, que no caso seria a ficha de cadastro de uma academia, e mostrar um menu com as opções de salvar no arquivo, consultar e excluir. Para a consulta, preciso fazer consulta por dois métodos. No caso, fiz por ID do usuário e CPF, porém, em ConsultarPorCPF() está dando um erro em if(ficha == NULL || ficha->cpf == cpf) e não sei porque. Segue o código:

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define ARQUIVO "Ficha.dat"

typedef struct
{
int   id;
float peso;
float altura;
char  objetivo[70];
char  nome[70];
char  cpf[11];
char  rg[7];
char  telefone[11];
char email[70];
char endereco[70];
}Ficha;

void menu();
int LerString(char *str, int tammax);
int Cadastro();
int PedeDados(Ficha *ficha);
int Gravar(Ficha *ficha);
int ConsultarPorID();
int ConsultarPorCPF();
int MostraFicha(Ficha *ficha);
int Excluir();
Ficha *LeProximaFicha(FILE *file);


int main()
{
menu();
return 0;
}
  
void menu()
{
    int escolha;
    int opcao;
    do
    {
         printf("\n-----------------------------------------");
printf("\n\nMenu:\n\n");
         printf("0. Sair\n");
         printf("1. Novo Cadastro\n");
         printf("2. Consulta por ID\n");
         printf("3. Consultar por CPF\n");
         printf ("4. Exclusão\n");
         scanf("%d",&escolha);
   
         switch (escolha)
        {
            case 0: 
                printf("Fim!\n"); 
                break;
            case 1:
                Cadastro();
                break;
            case 2:
            ConsultarPorID();
                break;
			case 3:
				ConsultarPorCPF();      
             	break;
		    case 4:
            	Excluir();
            	break;
            default: printf("Opção invalida. Tente novamente!\n");
                break;
        }    
  
    } while (escolha != 0);     
}

int Cadastro()
{
    Ficha *ficha = (Ficha *) malloc (sizeof (Ficha));
    
    if(!PedeDados(ficha))
    {
        free(ficha);
        return 0;
    }
    
    if(!Gravar(ficha))
    {
        free(ficha);
        return 0;
    }
    
    free(ficha);
    
    return 1;
}

int PedeDados(Ficha *ficha)
{

    if(ficha == NULL)
    {
        printf("\nFicha invalida para pedir dados!\n");
        return 0;
    }
    
else {ficha->id++;}
    printf("ID: ");
    fflush(stdin);
    scanf ("%d",ficha->id);
    printf("\nNome: ");
  	fflush(stdin);
 
    LerString(ficha->nome, 70);
    printf("CPF: ");
 	fflush(stdin);
    LerString(ficha->cpf, 11);
    printf("RG: ");
  	fflush(stdin);
    LerString(ficha->rg, 7);
    printf("Telefone: ");
	fflush(stdin);
    LerString(ficha->telefone, 11);
    printf("Endereço: ");
	fflush(stdin);
    LerString(ficha->endereco, 70);
    printf("Email: ");
	fflush(stdin);
    LerString(ficha->email, 70);
    printf("Peso: ");
  	fflush(stdin);
    scanf("%f", &ficha->peso);
    printf("Altura: ");
  	fflush(stdin);
    scanf("%f", &ficha->altura);
	printf("Objetivo: ");
	fflush(stdin);
    LerString(ficha->objetivo, 70);
    
    return 1;
    
}

int LerString(char *str, int tammax)
{
    int c, i=0;
    c = getchar();
    while (i==0 || (c != '\n' && c != EOF)) { 
        if(c == '\n' || c == EOF)
        {
            if(i >= 0)
                i--;
        }
        else if(i < tammax - 1)
        {
            str[i] = c;
        }
        c = getchar();
        i++;
        
    }
    if(i >= tammax - 1)
        i = tammax - 1;
    str[i] = '\0';
    fflush(stdin);
    
    return i;
}

int Gravar(Ficha *ficha)
{
    FILE *file; 
      
    file = fopen (ARQUIVO, "a"); 
    if (file == NULL) 
    { 
        printf("\nErro ao abrir o arquivo!\n"); 
        return 0;
    } 
    
    if(ficha == NULL)
    {
        printf("\nFicha invalida!\n");
        return 0;
    }
      
    if(fwrite (ficha, sizeof(Ficha), 1, file) == 0)  
        printf("Erro ao gravar Ficha %d !\n", ficha->id); 
  
    fclose (file);
    
    return 1;
}

int ConsultarPorID()
{
    FILE *file;
    int id;
    Ficha *ficha = NULL;
    
    printf("\n\nInforme o ID: ");
    fflush(stdin);
    scanf("%d",&id);
    fflush(stdin);
    
    file = fopen (ARQUIVO, "rb"); 
    if (file == NULL) 
    { 
        printf("\nErro ao abrir o arquivo!\n"); 
        return 0;
    }
    
    while(1)
    {
        if(feof(file))
            break;
        
        ficha = LeProximaFicha(file);
        
        if(ficha == NULL || ficha->id == id)
            break;
        
        free(ficha);
    }
    
    if(ficha != NULL)
    {
        printf("\nFicha encontrada no banco de dados!\n");
        MostraFicha(ficha);
        free(ficha);
    }
    else
    {
        printf("\nFicha %d nao encontrada!\n",  id);
    }
    
    fclose(file);
    
    return 1;
}
int ConsultarPorCPF()
{
    FILE *file;
    char cpf;
    Ficha *ficha = NULL;
    
    printf("\n\nInforme o CPF: ");
    fflush(stdin);
    scanf("%s",&cpf);
    fflush(stdin);
    
    file = fopen (ARQUIVO, "rb"); 
    if (file == NULL) 
    { 
        printf("\nErro ao abrir o arquivo!\n"); 
        return 0;
    }
    
    while(1)
    {
        if(feof(file))
            break;
        
        ficha = LeProximaFicha(file);
        
        if(ficha == NULL || ficha->cpf == cpf)
            break;
        
        free(ficha);
    }
    
    if(ficha != NULL)
    {
        printf("\nFicha encontrada no banco de dados!\n");
        MostraFicha(ficha);
        free(ficha);
    }
    else
    {
        printf("\nFicha %d nao encontrada!\n",  cpf);
    }
    
    fclose(file);
    
    return 1;
}


int MostraFicha(Ficha *ficha)
{
    if(ficha == NULL)
    {
        printf("\nFicha invalida para mostrar!\n");
        return 0;
    }
    
    printf("\nID: %d\n", ficha->id);
    printf("Nome: %s\n", ficha->nome);
    printf("CPF: %s\n", ficha->cpf);
    printf("RG: %s\n", ficha->rg);
    printf("Telefone: %s\n", ficha->telefone);
    printf("Endereço: %s\n", ficha->endereco);
    printf("Email: %s\n", ficha->email);
    printf("Peso: %.2f\n", ficha->peso);
    printf("Altura: %.2f\n", ficha->altura);
    printf("Objetivo: %s\n", ficha->objetivo);
    
    return 1;
}

Ficha *LeProximaFicha(FILE *file)
{
    Ficha *ficha;
    
    if (file == NULL) 
    { 
        printf("\nArquivo invalido!\n"); 
        return 0;
    } 
    
    ficha = (Ficha *) malloc (sizeof (Ficha));
    
    if(fread(ficha, sizeof(Ficha), 1, file) == 0)
    {
        printf("Erro ao ler Ficha!\n");
        free(ficha);
        ficha = NULL;
    }
    
    return ficha;
}

Também falta a parte de exclusão de arquivo, que não consegui fazer.

  • Curtir 1
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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!