Ir ao conteúdo
  • Cadastre-se

C Função sobre fazer cadastros e gravar em um arquivo


luckyiers

Posts recomendados

Olá boa tarde preciso criar uma função para gravar em arquivo (como registro e modo binário) o CRM de um medico o seu nome e sua especialidade (preciso utilizar structs e o CRM não pode se repetir) não estou entendo como vou fazer a função de não repetir os números de CRM. Obrigado

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>

//protótipo das funções
int menu();
void cadastrar();
void listar();
void consultar();

//criação da struct
typedef struct
{
	char cpf[15], nome[41];
	float credito; 
} cliente;

//função principal
main()
{
	int resp;
	do
	{
		resp = menu();
		switch(resp)
		{
			case 1 : cadastrar();
			break;
			//case 2 : listar();
			break;
			case 3 : consultar();
			break;
			case 0 : exit(0); 
			default:
				{
					printf("\nOpcao invalida...\n");
					system("pause");
				}
		}
	} while (resp !=0);
}

//função cadastrar()
void cadastrar()
{
	//declaração das variáveis locais
	cliente cadcliente;
	char resposta;
	
	//declaração ponteiro do arquivo
	FILE *pontarq;
	
	//abrir o arquivo para escrita no modo binário (ab)
	pontarq = fopen("cadastrocli.txt", "ab");
		
	//estrutura de repetição da entrada de dados
	do
	{
		system("cls");
		printf("Informe o CPF do cliente: ");
		fflush(stdin);
		scanf("%14[^\n]", cadcliente.cpf);
		printf("Informe o nome do cliente: ");
		fflush(stdin);
		scanf("%40[^\n]", cadcliente.nome);
		printf("Informe o valor do credito: ");
		scanf("%f", &cadcliente.credito);
		
		//gravar as informações no arquivo
		fwrite(&cadcliente, sizeof(cadcliente),1,pontarq);
		
		printf("Cadastrar outro cliente <S/N>");
		resposta = getche();
		
	} while(toupper(resposta)=='S');
	
	//fechar o arquivo
	fclose(pontarq);
}

//função menu()
int menu()
{
	//declaração da variável
	int opcao;
	system("cls");
	printf("1-Cadastrar\n2-Listar\n3-Consultar\n0-Sair\n");
	printf("Opcao?: ");
	scanf("%i", &opcao);
	
	return opcao;
}

//função consultar()
void consultar()
{
	//variáveis locais
	cliente cadcliente;
	char chave[41];
	int flag = 0;
	
	//ponteiro para o arquivo
	FILE *pontarq;
	
	//abrir o arquivo para leitura modo binário
	if((pontarq=fopen("cadastrocli.txt", "rb"))==NULL)
	{
		printf("\nErro na abertura do arquivo ou nao ha registros\n");
	}
	else
	{
		system("cls");
		printf("Informe o nome a consultar: ");
		fflush(stdin);
		scanf("%40[^\n]", chave);
		
		//estrutura de repetição para ler o arquivo e comparar com a chave
		while((fread(&cadcliente, sizeof(cadcliente), 1, pontarq))==1)
		{
			if(strcmp(strupr(chave),strupr(cadcliente.nome))==0)
			{
				printf("CPF: %s", cadcliente.cpf);
				printf("\nNome: %s", cadcliente.nome);
				printf("\nCredito: %.2f\n", cadcliente.credito);
				
				//mostrar flag para 1 - encontrou
				flag = 1;
			}
		}
		if(flag == 0)
			printf("\nCliente nao cadastrado...\n");
		
		//fechar o arquivo
		fclose(pontarq);
	}
	system("pause");
}

Tem esse cadastro de CPF o nome e o credito mais eu não queria que repetisse tipo por exemplo o CPF eu n sei como q eu posso estar fazendo isso

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

Faça o simples:

  • crie um vetor dessas estruturas para os dados 
  • ao iniciar o programa veja se tem já um arquivo com dados anteriores e leia para dentro do vetor
  • na execução do programa use só o vetor
  • ao final regrave o arquivo com os dados

Na hora de inserir, se achar importante, pode inserir por alguma ordem, como o CRM ou o nome

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

@lucky8981    para compara você pode pesquisar no arquivo e verificar se esse dado já foi cadastrado ,  usando a função strcmp , que compara string's ,  mas trabalhar com arquivo é muito difícil ,  então melhor pegar os dados que estão no arquivo , logo no início do programa e colocar nas struct , e para isso você precisa criar um vetor de struct ,  e em cada posição desse vetor armazena um conjunto de dados que foi cadastrado , e no final do programa salva tudo que está na struct gravando ela no arquivo , e existe muitos outros modos de fazer isso , e seu código com essa função de comparar os dados inseridos pelo usuário e ver se são repetidos ou não , pode assim   :

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iomanip>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define getch() _getch();
//protótipo das funções
int menu();
int cadastrar(int);
void listar(int);
void consultar(int);
void grava_tudo_no_arquivo(int);
int pega_dados_do_arquivo(int);
//criação da struct
typedef struct
{
	char cpf[15], nome[41],
	     titulo_eleitor[20],
	     certif_militar[20];
    float credito;
} cliente;
cliente cadcliente[100];
//função principal

int main()
{
    int resp,contador = pega_dados_do_arquivo(0);
    do
    {
        resp = menu();
        switch( resp )
        {
        case 1 :
            contador = cadastrar(contador);
            break;
        case 2 :
            listar(contador);
            break;
        case 3 :
            consultar(contador);
            break;
        case 0 :
            grava_tudo_no_arquivo(contador);
            exit(0);
        default:
            printf("\nOpcao invalida...\n");
            system("pause");
        }
    } while ( resp != 0 );
    return 16;
}
//função cadastrar()
int cadastrar(int contador)
{
    //declaração das variáveis locais
    char resposta;
    int ax;
	do
	{
	    LabeL_1: // pode ser qualquer nome
        system("cls");
        printf("Informe o CPF do cliente: ");
        fflush(stdin);
        scanf("%14[^\n]", cadcliente[contador].cpf);//o contador aponta para a posição do vetor de struct ou typedef
        printf("Informe o nome do cliente: ");
        fflush(stdin);
        scanf("%40[^\n]", cadcliente[contador].nome);
        printf("Informe o valor do credito: ");
        scanf("%f", &cadcliente[contador].credito);

		ax = 0;//começa pesquisar da posição zero , a primeira no vetor
        while( ax < contador )
        {
            if( strcmp( cadcliente[ax].cpf,cadcliente[contador].cpf ) == 0 )
            {
                printf("ja tem um cpf com esse numero , digite cpf nome credito novamente   TecLe");
                getch();
                goto LabeL_1; // comando em desuso , mas func
            }
            ax++;
        }
        contador++;
		printf("Cadastrar outro cliente <S/N>");
		resposta = getche();

	} while(toupper(resposta)=='S');
	return contador;
}
//função menu()
int menu()
{
	//declaração da variável
	int opcao;
	system("cls");
	printf(" 0 - Sair\n");
	printf(" 1 - Cadastrar\n");
	printf(" 2 - Listar\n");
	printf(" 3 - Consultar\n");
	printf("     Opcao ? : ");
	scanf("%i", &opcao);

	return opcao;
}

//função consultar()
void consultar(int contador)
{
    //variáveis locais
    cliente cadcliente;
    char chave[41];
    int flag = 0;

    //ponteiro para o arquivo
    FILE *pontarq;

    //abrir o arquivo para leitura modo binário
    if((pontarq=fopen("cadastrocli.txt", "rb"))==NULL)
    {
        printf("\nErro na abertura do arquivo ou nao ha registros\n");
    }
    else
    {
        system("cls");
        printf("Informe o nome a consultar: ");
        fflush(stdin);
        scanf("%40[^\n]", chave);

        //estrutura de repetição para ler o arquivo e comparar com a chave
        while((fread(&cadcliente, sizeof(cadcliente), 1, pontarq))==1)
        {
            if(strcmp(strupr(chave),strupr(cadcliente.nome))==0)
            {
                printf("CPF: %s", cadcliente.cpf);
                printf("\nNome: %s", cadcliente.nome);
                printf("\nCredito: %.2f\n", cadcliente.credito);

                //mostrar flag para 1 - encontrou
                flag = 1;
            }
        }
        if(flag == 0)
            printf("\nCliente nao cadastrado...\n");

        //fechar o arquivo
        fclose(pontarq);
    }
    system("pause");
}
void listar(int contador)
{
    int j,i;
    for(j=0;j<contador; j++)
    {
        printf("CPF -------: %s\n"    ,cadcliente[j].cpf    );
        printf("NOME ------: %s\n"    ,cadcliente[j].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[j].credito);
    }
    printf("    TecLe !");
    getch();
}
void grava_tudo_no_arquivo(int contador)
{
    int j;
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "wb");// cria resete e abre o arquivo para gravar desde o início dele
    for(j=0; j<contador; j++)
        fwrite(&cadcliente[j], sizeof(cadcliente),1,pontarq);
    fclose(pontarq);
}
int pega_dados_do_arquivo(int contador)
{
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "rb");
    if(pontarq == NULL )return 0;
    printf("Dados já cadastrados e que estão gravados no Arquivo\n");
    while( fread( &cadcliente[contador], sizeof(cadcliente), 1, pontarq ) == 1 )
    {
        printf("CPF -------: %s\n"    ,cadcliente[contador].cpf    );
        printf("NOME ------: %s\n"    ,cadcliente[contador].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[contador].credito);
        contador++;
    }
    fclose(pontarq);
    printf("    Tecle !");
    getch();
    return contador;
}

 

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

@devair1010 cara muito obrigado estou tentando passar em ordem alfabetica mais ta listando somente 1 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iomanip>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define getch() _getch();
//protótipo das funções
int menu();
int cadastrar(int);
void listar(int);
void consultar(int);
void grava_tudo_no_arquivo(int);
int pega_dados_do_arquivo(int);
//criação da struct
typedef struct
{
	char crm[15], nome[41],
	     titulo_eleitor[20],
	     certif_militar[20];
    float credito;
} cliente;
cliente cadcliente[100];
//função principal

int main()
{
    int resp,contador = pega_dados_do_arquivo(0);
    do
    {
        resp = menu();
        switch( resp )
        {
        case 1 :
            contador = cadastrar(contador);
            break;
        case 2 :
            listar(contador);
            break;
        case 3 :
            consultar(contador);
            break;
        case 0 :
            grava_tudo_no_arquivo(contador);
            exit(0);
        default:
            printf("\nOpcao invalida...\n");
            system("pause");
        }
    } while ( resp != 0 );
    return 16;
}
//função cadastrar()
int cadastrar(int contador)
{
    //declaração das variáveis locais
    char resposta;
    int ax;
	do
	{
	    LabeL_1: // pode ser qualquer nome
        system("cls");
        printf("Informe o crm do cliente: ");
        fflush(stdin);
        scanf("%14[^\n]", cadcliente[contador].crm);//o contador aponta para a posição do vetor de struct ou typedef
        printf("Informe o nome do cliente: ");
        fflush(stdin);
        scanf("%40[^\n]", cadcliente[contador].nome);
        printf("Informe o valor do credito: ");
        scanf("%f", &cadcliente[contador].credito);

		ax = 0;//começa pesquisar da posição zero , a primeira no vetor
        while( ax < contador )
        {
            if( strcmp( cadcliente[ax].crm,cadcliente[contador].crm ) == 0 )
            {
                printf("ja tem um crm com esse numero , digite crm nome credito novamente   TecLe");
                getch();
                goto LabeL_1; // comando em desuso , mas func
            }
            ax++;
        }
        contador++;
		printf("Cadastrar outro cliente <S/N>");
		resposta = getche();

	} while(toupper(resposta)=='S');
	return contador;
}
//função menu()
int menu()
{
	//declaração da variável
	int opcao;
	system("cls");
	printf(" 0 - Sair\n");
	printf(" 1 - Cadastrar\n");
	printf(" 2 - Listar\n");
	printf(" 3 - Consultar\n");
	printf("     Opcao ? : ");
	scanf("%i", &opcao);

	return opcao;
}

//função consultar()
void consultar(int contador)
{
    //variáveis locais
    cliente cadcliente;
    char chave[41];
    int flag = 0;

    //ponteiro para o arquivo
    FILE *pontarq;

    //abrir o arquivo para leitura modo binário
    if((pontarq=fopen("cadastrocli.txt", "rb"))==NULL)
    {
        printf("\nErro na abertura do arquivo ou nao ha registros\n");
    }
    else
    {
        system("cls");
        printf("Informe o nome a consultar: ");
        fflush(stdin);
        scanf("%40[^\n]", chave);

        //estrutura de repetição para ler o arquivo e comparar com a chave
        while((fread(&cadcliente, sizeof(cadcliente), 1, pontarq))==1)
        {
            if(strcmp(strupr(chave),strupr(cadcliente.nome))==0)
            {
                printf("crm: %s", cadcliente.crm);
                printf("\nNome: %s", cadcliente.nome);
                printf("\nCredito: %.2f\n", cadcliente.credito);

                //mostrar flag para 1 - encontrou
                flag = 1;
            }
        }
        if(flag == 0)
            printf("\nCliente nao cadastrado...\n");

        //fechar o arquivo
        fclose(pontarq);
    }
    system("pause");
}
void listar(int contador)
{
    int j,i;
    for(j=0;j<contador; j++)
    {
        printf("crm -------: %s\n"    ,cadcliente[j].crm    );
        printf("NOME ------: %s\n"    ,cadcliente[j].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[j].credito);
    }
    fflush(stdin);
    printf("\nPessoas em ordem alfabetica:\n");
	for(i=1; i<contador; i++){
        for(j=i+1;j<contador;j++){
	        if(strcoll(cadcliente[i].nome , cadcliente[j].nome) > 0 ){
                cadcliente[0]=cadcliente[i];
                cadcliente[i]=cadcliente[j];
                cadcliente[j]=cadcliente[0];
                fflush(stdin);
	        }
        }
	}
	for(i=0;i<contador;i++){
        printf("NOME: %s\n",cadcliente[i].nome);
        fflush(stdin);
	}
    printf("Aperte qualquer Tecla");
    getch();
}
void grava_tudo_no_arquivo(int contador)
{
    int j;
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "wb");// cria resete e abre o arquivo para gravar desde o início dele
    for(j=0; j<contador; j++)
        fwrite(&cadcliente[j], sizeof(cadcliente),1,pontarq);
    fclose(pontarq);
}
int pega_dados_do_arquivo(int contador)
{
    FILE *pontarq;
    pontarq = fopen("cadastrocli.bin", "rb");
    if(pontarq == NULL )return 0;
    printf("Dados já cadastrados e que estão gravados no Arquivo\n");
    while( fread( &cadcliente[contador], sizeof(cadcliente), 1, pontarq ) == 1 )
    {
        printf("crm -------: %s\n"    ,cadcliente[contador].crm    );
        printf("NOME ------: %s\n"    ,cadcliente[contador].nome   );
        printf("CREDITO ---: %.2f\n\n",cadcliente[contador].credito);
        contador++;
    }
    fclose(pontarq);
    printf("    Tecle !");
    getch();
    return contador;
}

 

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

@lucky8981         para colocar em ordem alfabética , você está usando essa função strcoll , mas ela não costuma funcionar bem , não , melhor usar a strcmp , e assim estará em ordem pela primeira letra do nome , e se quiser realmente em ordem de todas as letras precisa algumas linhas de código a mais , e outra coisa é que você está usando a posição zero do vetor e essa posição está sendo usada , e ao modificar seu conteúdo vai deletar o que for armazenado ali   então use o fim do vetor ,  que é a posição 99 , ou envie o valor 1 no inicio para a função

 

pega_dados_do_arquivo (1);  

 

, assim na hora de cadastrar vai começar armazenar a partir da segunda posição , ficando livre a posição zero .

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

1 hora atrás, devair1010 disse:

função strcoll , mas ela não costuma funcionar bem , não , melhor usar a strcmp , e assim estará em ordem pela primeira letra do nome , e se quiser realmente em ordem de todas as letras precisa algumas linhas de código a mais , e outra coisa é que você está usando a posição zero do vetor e essa posição está sendo usada , e ao modificar seu conteúdo vai deletar o que for armazenado ali   então use o fim do vetor ,  que é a posição 99 , ou envie o valor 1 no inicio para a função

 

@devair1010 funções não tem costume. strcoll() funciona perfeitamente e tem exatamente o mesmo comportamento de strcmp(). A diferença é que strcoll() considera o locale definido para o programa. Se você chamar set_locale() ou usar qualquer mecanismo para definir o locale() os novos valores serão considerados na comparação e isso vai afetar a comparação de strings que tenham por exemplo caracteres acentuados.

 

nenhuma delas classifica em ordem alfabética ou pela primeira letra. Elas apenas comparam duas strings e retornam algo negativo, 0 ou algo positivo conforme a primeira string seja menor, igual ou maior que a segunda em ordem alfabética. Nenhuma das strings é alterada

 

  • Obrigado 2
  • Confuso 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

Elas apenas comparam duas strings e retornam algo negativo, 0 ou algo positivo conforme a primeira string seja menor, igual ou maior que a segunda em ordem alfabética. Nenhuma das strings é alterada

 

Na dúvida, teste.

 

Veja a saída

 

[locale original: 'C']
Comparando 'maçã' e 'mata'
para  strcmp() 'maçã' > 'mata' 
para strcoll() 'maçã' > 'mata' 

[Usando locale 'Portuguese_Brazil.1252']
Comparando 'maçã' e 'mata'
para  strcmp() 'maçã' > 'mata'
para strcoll() 'maçã' < 'mata' 

 

Deste programa
 

 #include <locale.h>
 #include <stdio.h>
 #include <string.h>
 #include <windows.h>

 int main(void)
{
    const char* str0 = "maçã";
    const char* str1 = "mata";
    char linha[80];
    char* local = &linha[0];
    const char* ordem[] = { "<", "=", ">" };

    SetConsoleOutputCP(65001);

    local = setlocale(LC_COLLATE, NULL); 
    printf( "[locale original: '%s']\n", local );
    printf( "Comparando '%s' e '%s'\n", str0, str1 );

    int i = strcmp(str0, str1) + 1;
    int j = strcoll(str0,str1) + 1;

    printf( "para  strcmp() '%s' %s '%s' \n", str0, ordem[i], str1 );
    printf( "para strcoll() '%s' %s '%s' \n", str0, ordem[j], str1 );

    local = setlocale(LC_COLLATE, "Portuguese"); 
    printf( "\n[Usando locale '%s']\n", local );
    printf( "Comparando '%s' e '%s'\n", str0, str1 );

    i = strcmp(str0, str1) + 1;
    j = strcoll(str0,str1) + 1;

    printf( "para  strcmp() '%s' %s '%s' \n", str0, ordem[i], str1 );
    printf( "para strcoll() '%s' %s '%s' \n", str0, ordem[j], str1 );

    return 0;

 

Que é um programa de 10 linhas duplicadas...

 

E entenda que em português "maçã" vem antes de "mata" e assim é o que retorna strcoll() para português. Mas para en_US por exemplo ou para o padrão C 't' vem antes de 'ç' e então se usar strcmp() e o texto tiver letras com acento vai ter resultados inesperados

 

Mas não é um problema de "costume" @devair1010 Ou é, na verdade, já que são configurações regionais.

 

 

  • Obrigado 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!