Ir ao conteúdo

Posts recomendados

Postado

Como faço para listar as pessoas? Eu armazenei os dados em uma struct e coloquei em arquivo .bin e agora eu quero ler esses dados e imprimir na tela do usuário. Como eu faço? Eu vi num fórum que eu teria que criar um for para "dar o inicio" de gravação de dados. Não sei se isso é realmente assim, comecei a escrever código em C a pouco tempo e não sei nada de programação. 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#define MAXPACIENTES 150


// DADOS DO PACIENTE

typedef struct{
    char nomecompleto[255];
    char datanasc[255];
    char CPF[255];
    char RG[255];
    char telefone[255];
    char email[255];
    char endereco[255];
    char cidadeEestado[255];
    char validacar[255];
    char convenio[255];
    char carteirinha[255];


}Cpaciente;



Cpaciente paciente[MAXPACIENTES];
int contP = 0;
int posicao;



void cadastroPaciente(){
setlocale(LC_ALL, "");



FILE *arquivo;
arquivo = fopen("cadastro_paciente.bin", "ab");
int dados, retornar, i;
char fpag = 'P' || 'C';
char formapag[2];




    if(arquivo == NULL){
        printf("Erro ao abrir o arquivo.");
        };

        // INICIALIZAÇÃO DA STRUCT EM VETORES
        for(contP = 0; contP <MAXPACIENTES; contP++){
         strcpy(paciente[contP].carteirinha, "NULL");
         strcpy(paciente[contP].cidadeEestado, "NULL");
         strcpy(paciente[contP].convenio, "NULL");
         strcpy(paciente[contP].CPF, "NULL");
         strcpy(paciente[contP].datanasc, "NULL");
         strcpy(paciente[contP].email, "NULL");
         strcpy(paciente[contP].endereco, "NULL");
         strcpy(paciente[contP].nomecompleto, "NULL");
         strcpy(paciente[contP].RG, "NULL");
         strcpy(paciente[contP].telefone, "NULL");
         strcpy(paciente[contP].validacar, "NULL");

        }

        //ARMAZENANDO DADOS NAS STRUCT

        for(contP = 0; contP < MAXPACIENTES; contP++){

        printf("Você está na tela de cadastramento de pacientes.\n\n");
        fflush(stdin);
        printf("Digite o CPF: ");
        fgets(paciente[contP].CPF, 255, stdin);
        printf("Digite o Nome Completo: ");
        fgets(paciente[contP].nomecompleto, 255, stdin); // Função que lê o nome
        printf("Digite a data de nascimento(EX: DD/MM/AAAA): ");
        fgets(paciente[contP].datanasc, 255, stdin); // Função que lê a data de nasc
        printf("Digite o CPF novamente: ");
        fgets(paciente[contP].CPF, 255, stdin);
        fflush(stdin);
        printf("Digite o número do RG: ");
        fgets(paciente[contP].RG, 255, stdin); // Função que lê o RG
        printf("Digite o número do Telefone/Celular: ");
        fgets(paciente[contP].telefone, 255, stdin); // Função que lê o num de telefone
        printf("Digite o email: ");
        fgets(paciente[contP].email, 255, stdin); // Função que lê o email

        printf("Digite o endereço completo(EX: Rua, numCasa - Bairro): ");
        fgets(paciente[contP].endereco, 255, stdin); // Função que lê o endereço
        printf("Digite a Cidade e o Estado(EX: Cidade/Estado): ");
        fgets(paciente[contP].cidadeEestado, 255, stdin);
        printf("Particular ou Convênio? Informe com P ou C: ");
        scanf("%c", &fpag); // Função que lê a forma de pagamento informada pelo printf
        fpag = toupper(fpag);
        if(fpag == 'P'){
           printf("Digite D para Dinheiro ou C para Cartão.\n");
           printf("Forma de pagamento: ");
           scanf("%s", formapag); // Função que lê a forma de pagamento informada pelo printf
            }else if(fpag == 'C'){
            printf("Nome do Convênio: ");
            scanf("%s", paciente[contP].convenio); // Função que lê o nome do convenio
            printf("Digite o número da carteirinha: ");
            scanf("%s", &paciente[contP].carteirinha); // Função que lê o num da carteirinha
            printf("Data de validade da carteirinha(DD/MM/AAAA), não inserir se já estiver vencida!: ");
            scanf("%s", paciente[contP].validacar); // Função que lê a validade da carteirinha
            }

        printf("Os dados estão corretos? Digite 1 para SIM ou 2 para NÃO: ");
        scanf("%d", &dados);

        if(dados == 1){
            fwrite(&paciente[contP], sizeof(Cpaciente), 1, arquivo);
            contP = contP + 1;
            fclose(arquivo);
            printf("O paciente foi cadastrado com sucesso!\n");
            }else if(dados == 2){
            printf("Os dados não foram cadastrados!\n");
            }



    printf("Voltar ao menu principal? Digite 1 ou para sair digite 0: ");
    scanf("%d", &retornar);
        if(retornar == 1){
            system("cls");
            menuprincipal();
        }else if(retornar == 0){
            exit(1);
        }
    }

}

void consultaCadastro(){

FILE *arquivo;
arquivo = fopen("cadastro_paciente.bin","rb");


char CPF[255];


printf("VOCÊ ESTÁ NA TELA DE CONSULTAR CADASTRO\n\n");

printf("Para encontrar o registro, digite o número do CPF: ");
fflush(stdin);
gets(CPF);

for(contP = 0; contP < MAXPACIENTES; contP++){


    while( fread(&paciente[contP], sizeof(Cpaciente), 1, arquivo)){
    if(strcmp(CPF, paciente[contP].CPF)== 0){
        printf("Registro encontrado!\n");
        posicao = contP;
        }else{
        posicao = -1;
        }
    if(posicao = -1) {
    printf(" \n Registro não encontrado! ");
    }else{
    printf(" \n Registro Encontrado!\n");
    printf("CPF: %s", paciente[posicao].CPF);

            }
        }
    }
}

 

  • Obrigado 1
Postado

Talvez o problema esteja na leitura usando dois laços, um for e um while. Não apenas não é necessário como o intuito do programa não fica claro. Por sinal, o retorno de fread não é verdadeiro/falso (ou seja, zero ou diferente de zero com esse propósito específico) mas, sim, o número de elementos lidos do arquivo (eventualmente pode ser zero). 

 

Sabendo de antemão que existe sempre o mesmo número  de entradas no arquivo (150), você pode lê-los todos com uma chamada de fread:

 

const int info = fread(&paciente, sizeof(Cpaciente), MAXPACIENTES, arquivo)
  
if (info != MAXPACIENTES)
{
	/* Gerenciar o erro adequadamente aqui */
}

 

Depois dessa etapa, você pode checar todos os elementos do vetor paciente procurando pelo cpf do cliente. Ou seja, usando apenas um for.

 

Edit: Noutra olhadela rápida, e apesar que você de fato não precisa de dois laços, é provável que o erro não esteja ai pelo menos enquanto contP == 0. O próximo candidato a testar seria strcmp.

  • Curtir 1
  • Obrigado 1
Postado

@Gegê82737    você não postou a função para listar , e então seu código  poderia ser assim  :

#include <stdio.h>
#include <windows.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define MAXPACIENTES 150
void            _Meu_Fflush();
void Listar();
// DADOS DO PACIENTE
typedef struct{
    char nomecompleto [255];
    char datanasc     [255];
    char CPF          [255];
    char RG           [255];
    char telefone     [255];
    char email        [255];
    char endereco     [255];
    char cidadeEestado[255];
    char validacar    [255];
    char convenio     [255];
    char carteirinha  [255];
}Cpaciente;
Cpaciente paciente[MAXPACIENTES];
void desenha(int co_i, int li_i, int caract[],int w);
void gotoxy_2(int,int);
int carac2[70]={
  124,130,130,126,  2,130,124,/* Digito 9 */ // 01111100 --|
  124,130,124,130,130,130,124,/* Digito 8 */ // 10000010   |
  254,  2, 12, 16, 96, 64, 64,/* Digito 7 */ // 10000010   |
  124,128,188,194,130,130,124,/* Digito 6 */ // 01111110   |-- Digito Nove
  252,128,252,  2,  2,130,124,/* Digito 5 */ // 00000010   |
   28, 36, 68,132,252,  4, 62,/* Digito 4 */ // 10000010   |
  124,130,  2, 28,  2,130,124,/* Digito 3 */ // 01111100 --|
  124,130,  2, 28, 96,128,252,/* Digito 2 */
   16,112, 16, 16, 16, 16,124,/* Digito 1 */
   56, 68,138,146,162, 68, 56 /* Digito 0 */
  };
int contP = 0;
int posicao;
int cadastroPaciente()
{
    FILE *arquivo;
    arquivo = fopen("cadastro_paciente.bin", "ab");
    int dados, retornar, i;
    char fpag = 'P' || 'C';
    char formapag[2];
    if(arquivo == NULL)
    {
        printf("Erro ao abrir o arquivo.");
    };
    // INICIALIZAÇÃO DA STRUCT EM VETORES
    for(contP = 0; contP <MAXPACIENTES; contP++){
        strcpy(paciente[contP].carteirinha, "NULL");
        strcpy(paciente[contP].cidadeEestado, "NULL");
        strcpy(paciente[contP].convenio, "NULL");
        strcpy(paciente[contP].CPF, "NULL");
        strcpy(paciente[contP].datanasc, "NULL");
        strcpy(paciente[contP].email, "NULL");
        strcpy(paciente[contP].endereco, "NULL");
        strcpy(paciente[contP].nomecompleto, "NULL");
        strcpy(paciente[contP].RG, "NULL");
        strcpy(paciente[contP].telefone, "NULL");
        strcpy(paciente[contP].validacar, "NULL");
    }
    //ARMAZENANDO DADOS NAS STRUCT
    for(contP = 0; contP < MAXPACIENTES; contP++)
    {
        printf("Você está na tela de cadastramento de pacientes.\n\n");
        _Meu_Fflush();
        printf("Digite o CPF: ");
        fgets(paciente[contP].CPF, 255, stdin);
        printf("Digite o Nome Completo: ");
        fgets(paciente[contP].nomecompleto, 255, stdin); // Função que lê o nome
        printf("Digite a data de nascimento(EX: DD/MM/AAAA): ");
        fgets(paciente[contP].datanasc, 255, stdin); // Função que lê a data de nasc
        printf("Digite o CPF novamente: ");
        fgets(paciente[contP].CPF, 255, stdin);
        _Meu_Fflush();
        printf("Digite o número do RG: ");
        fgets(paciente[contP].RG, 255, stdin); // Função que lê o RG
        printf("Digite o número do Telefone/Celular: ");
        fgets(paciente[contP].telefone, 255, stdin); // Função que lê o num de telefone
        printf("Digite o email: ");
        fgets(paciente[contP].email, 255, stdin); // Função que lê o email
        printf("Digite o endereço completo(EX: Rua, numCasa - Bairro): ");
        fgets(paciente[contP].endereco, 255, stdin); // Função que lê o endereço
        printf("Digite a Cidade e o Estado(EX: Cidade/Estado): ");
        fgets(paciente[contP].cidadeEestado, 255, stdin);
        printf("Particular ou Convênio? Informe com P ou C: ");
        scanf("%c", &fpag); // Função que lê a forma de pagamento informada pelo printf
        fpag = toupper(fpag);
        if(fpag == 'P'){
            printf("Digite D para Dinheiro ou C para Cartão.\n");
            printf("Forma de pagamento: ");
            scanf("%s", formapag); // Função que lê a forma de pagamento informada pelo printf
        }
        else
            if(fpag == 'C')
            {
                printf("Nome do Convênio: ");
                scanf("%s", paciente[contP].convenio); // Função que lê o nome do convenio
                printf("Digite o número da carteirinha: ");
                scanf("%s", &paciente[contP].carteirinha); // Função que lê o num da carteirinha
                printf("Data de validade da carteirinha(DD/MM/AAAA), não inserir se já estiver vencida!: ");
                scanf("%s", paciente[contP].validacar); // Função que lê a validade da carteirinha
            }
        printf("Os dados estão corretos? Digite 1 para SIM ou 2 para NÃO: ");
        scanf("%d", &dados);
        if(dados == 1){
            fwrite(&paciente[contP], sizeof(Cpaciente), 1, arquivo);
            contP = contP + 1;
            fclose(arquivo);
            printf("O paciente foi cadastrado com sucesso!\n");
        }
        else
            if(dados == 2)
            {
                printf("Os dados não foram cadastrados!\n");
            }
        printf("Voltar ao menu principal? Digite 1 ou para sair digite 0: ");
        scanf("%d", &retornar);
        if(retornar == 1)
        {
            system("cls");
            //menuprincipal();
        }
        else
            if(retornar == 0)
            {
                break;
            }
    }
}
void consultaCadastro()
{
    FILE *arquivo;
    arquivo = fopen("cadastro_paciente.bin","rb");
    char CPF[255];
    printf("VOCÊ ESTÁ NA TELA DE CONSULTAR CADASTRO\n\n");
    printf("Para encontrar o registro, digite o número do CPF: ");
    fflush(stdin);
    gets(CPF);
    for(contP = 0; contP < MAXPACIENTES; contP++)
    {
        while( fread(&paciente[contP], sizeof(Cpaciente), 1, arquivo))
        {
            if(strcmp(CPF, paciente[contP].CPF)== 0)
            {
                printf("Registro encontrado!\n");
                posicao = contP;
            }
            else
            {
                posicao = -1;
            }
            if(posicao = -1)
            {
                printf(" \n Registro não encontrado! ");
            }
            else
            {
                printf(" \n Registro Encontrado!\n");
                printf("CPF: %s", paciente[posicao].CPF);
            }
        }
    }
}
int main()
{
    int j;
    cadastroPaciente();
    Listar();
    printf("\n\n");
    int w,px,py,x;                            /* variáveis simples                       */
    HANDLE hOut;                              /* controle dos dispositivos do pc         */
    HBITMAP hb;
    long lg;
    hOut= GetStdHandle(STD_OUTPUT_HANDLE);    /* pega a saída padrão                     */
    CONSOLE_SCREEN_BUFFER_INFO SBInfo;        /* informações sobre a buffer da tela      */
    GetConsoleScreenBufferInfo(hOut, &SBInfo);/* pega a posição do cursor do console     */
    GetBitmapBits(hb,lg,NULL);
    px = SBInfo.dwCursorPosition.X;           /* pX será a posição da coluna do cursor no console */
    py = SBInfo.dwCursorPosition.Y;           /* pY será a posição da linha do cursor no console  */
    gotoxy_2(0,py+20);
    gotoxy_2(0,py+2 );
    for( j=0; j<10; j++ )
        desenha(40,py,carac2,j);  /* são os dígitos   */
    printf("\n\n\n\n");
    return 32768;
}
void Listar()
{
    int i;
    printf("esta no Listar !\n\n");
    for(i=0; i<contP; i++)
    {
        printf("Nome -------> %s", paciente[i].nomecompleto );
        printf("cpf --------> %s", paciente[i].CPF          );
        printf("celular ----> %s", paciente[i].telefone     );
        printf("Nascimento -> %s", paciente[i].datanasc     );
        printf("RG ---------> %s", paciente[i].RG           );
        printf("Email ------> %s", paciente[i].email        );
        printf("Endereco ---> %s", paciente[i].endereco     );
        printf("Cidade -----> %s", paciente[i].cidadeEestado);
    }
}
void            _Meu_Fflush()
{
    char c;
    while( c = fgetc(stdin) != '\n');
}
void desenha(int co_i, int li_i, int caract[],int w){
    int x,y,q,co,li;
    li=li_i;
    w *= 7;
    for(x=0;x<7;x++){                  /* linhas */
        co=co_i;
        q=caract[x+w];
        for(y=0;y<16;y += 2){              /* colunas */
            gotoxy_2(co,li);
            if(q % 2==0)printf("  ");
            else   printf("%c%c",219,219);
            co -= 2;
            q/=2;
        }
        li++;
    }
    gotoxy_2(70,li_i+7);
    Sleep(1000);
}
void gotoxy_2(int x, int y){/*imprimir na linha e coluna desejada */
  SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE),(COORD){x,y});
}

 

  • Confuso 1
Postado
6 horas atrás, V!OLADOR disse:

Talvez o problema esteja na leitura usando dois laços, um for e um while. Não apenas não é necessário como o intuito do programa não fica claro. Por sinal, o retorno de fread não é verdadeiro/falso (ou seja, zero ou diferente de zero com esse propósito específico) mas, sim, o número de elementos lidos do arquivo (eventualmente pode ser zero). 

 

Sabendo de antemão que existe sempre o mesmo número  de entradas no arquivo (150), você pode lê-los todos com uma chamada de fread:

 


const int info = fread(&paciente, sizeof(Cpaciente), MAXPACIENTES, arquivo)
  
if (info != MAXPACIENTES)
{
	/* Gerenciar o erro adequadamente aqui */
}

 

Depois dessa etapa, você pode checar todos os elementos do vetor paciente procurando pelo cpf do cliente. Ou seja, usando apenas um for.

 

Edit: Noutra olhadela rápida, e apesar que você de fato não precisa de dois laços, é provável que o erro não esteja ai pelo menos enquanto contP == 0. O próximo candidato a testar seria strcmp.

Fiz isso aí que você me sugeriu mas não consegui o retorno desejado =(

adicionado 2 minutos depois
5 horas atrás, devair1010 disse:

@Gegê82737    você não postou a função para listar , e então seu código  poderia ser assim  :


#include <stdio.h>
#include <windows.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define MAXPACIENTES 150
void            _Meu_Fflush();
void Listar();
// DADOS DO PACIENTE
typedef struct{
    char nomecompleto [255];
    char datanasc     [255];
    char CPF          [255];
    char RG           [255];
    char telefone     [255];
    char email        [255];
    char endereco     [255];
    char cidadeEestado[255];
    char validacar    [255];
    char convenio     [255];
    char carteirinha  [255];
}Cpaciente;
Cpaciente paciente[MAXPACIENTES];
void desenha(int co_i, int li_i, int caract[],int w);
void gotoxy_2(int,int);
int carac2[70]={
  124,130,130,126,  2,130,124,/* Digito 9 */ // 01111100 --|
  124,130,124,130,130,130,124,/* Digito 8 */ // 10000010   |
  254,  2, 12, 16, 96, 64, 64,/* Digito 7 */ // 10000010   |
  124,128,188,194,130,130,124,/* Digito 6 */ // 01111110   |-- Digito Nove
  252,128,252,  2,  2,130,124,/* Digito 5 */ // 00000010   |
   28, 36, 68,132,252,  4, 62,/* Digito 4 */ // 10000010   |
  124,130,  2, 28,  2,130,124,/* Digito 3 */ // 01111100 --|
  124,130,  2, 28, 96,128,252,/* Digito 2 */
   16,112, 16, 16, 16, 16,124,/* Digito 1 */
   56, 68,138,146,162, 68, 56 /* Digito 0 */
  };
int contP = 0;
int posicao;
int cadastroPaciente()
{
    FILE *arquivo;
    arquivo = fopen("cadastro_paciente.bin", "ab");
    int dados, retornar, i;
    char fpag = 'P' || 'C';
    char formapag[2];
    if(arquivo == NULL)
    {
        printf("Erro ao abrir o arquivo.");
    };
    // INICIALIZAÇÃO DA STRUCT EM VETORES
    for(contP = 0; contP <MAXPACIENTES; contP++){
        strcpy(paciente[contP].carteirinha, "NULL");
        strcpy(paciente[contP].cidadeEestado, "NULL");
        strcpy(paciente[contP].convenio, "NULL");
        strcpy(paciente[contP].CPF, "NULL");
        strcpy(paciente[contP].datanasc, "NULL");
        strcpy(paciente[contP].email, "NULL");
        strcpy(paciente[contP].endereco, "NULL");
        strcpy(paciente[contP].nomecompleto, "NULL");
        strcpy(paciente[contP].RG, "NULL");
        strcpy(paciente[contP].telefone, "NULL");
        strcpy(paciente[contP].validacar, "NULL");
    }
    //ARMAZENANDO DADOS NAS STRUCT
    for(contP = 0; contP < MAXPACIENTES; contP++)
    {
        printf("Você está na tela de cadastramento de pacientes.\n\n");
        _Meu_Fflush();
        printf("Digite o CPF: ");
        fgets(paciente[contP].CPF, 255, stdin);
        printf("Digite o Nome Completo: ");
        fgets(paciente[contP].nomecompleto, 255, stdin); // Função que lê o nome
        printf("Digite a data de nascimento(EX: DD/MM/AAAA): ");
        fgets(paciente[contP].datanasc, 255, stdin); // Função que lê a data de nasc
        printf("Digite o CPF novamente: ");
        fgets(paciente[contP].CPF, 255, stdin);
        _Meu_Fflush();
        printf("Digite o número do RG: ");
        fgets(paciente[contP].RG, 255, stdin); // Função que lê o RG
        printf("Digite o número do Telefone/Celular: ");
        fgets(paciente[contP].telefone, 255, stdin); // Função que lê o num de telefone
        printf("Digite o email: ");
        fgets(paciente[contP].email, 255, stdin); // Função que lê o email
        printf("Digite o endereço completo(EX: Rua, numCasa - Bairro): ");
        fgets(paciente[contP].endereco, 255, stdin); // Função que lê o endereço
        printf("Digite a Cidade e o Estado(EX: Cidade/Estado): ");
        fgets(paciente[contP].cidadeEestado, 255, stdin);
        printf("Particular ou Convênio? Informe com P ou C: ");
        scanf("%c", &fpag); // Função que lê a forma de pagamento informada pelo printf
        fpag = toupper(fpag);
        if(fpag == 'P'){
            printf("Digite D para Dinheiro ou C para Cartão.\n");
            printf("Forma de pagamento: ");
            scanf("%s", formapag); // Função que lê a forma de pagamento informada pelo printf
        }
        else
            if(fpag == 'C')
            {
                printf("Nome do Convênio: ");
                scanf("%s", paciente[contP].convenio); // Função que lê o nome do convenio
                printf("Digite o número da carteirinha: ");
                scanf("%s", &paciente[contP].carteirinha); // Função que lê o num da carteirinha
                printf("Data de validade da carteirinha(DD/MM/AAAA), não inserir se já estiver vencida!: ");
                scanf("%s", paciente[contP].validacar); // Função que lê a validade da carteirinha
            }
        printf("Os dados estão corretos? Digite 1 para SIM ou 2 para NÃO: ");
        scanf("%d", &dados);
        if(dados == 1){
            fwrite(&paciente[contP], sizeof(Cpaciente), 1, arquivo);
            contP = contP + 1;
            fclose(arquivo);
            printf("O paciente foi cadastrado com sucesso!\n");
        }
        else
            if(dados == 2)
            {
                printf("Os dados não foram cadastrados!\n");
            }
        printf("Voltar ao menu principal? Digite 1 ou para sair digite 0: ");
        scanf("%d", &retornar);
        if(retornar == 1)
        {
            system("cls");
            //menuprincipal();
        }
        else
            if(retornar == 0)
            {
                break;
            }
    }
}
void consultaCadastro()
{
    FILE *arquivo;
    arquivo = fopen("cadastro_paciente.bin","rb");
    char CPF[255];
    printf("VOCÊ ESTÁ NA TELA DE CONSULTAR CADASTRO\n\n");
    printf("Para encontrar o registro, digite o número do CPF: ");
    fflush(stdin);
    gets(CPF);
    for(contP = 0; contP < MAXPACIENTES; contP++)
    {
        while( fread(&paciente[contP], sizeof(Cpaciente), 1, arquivo))
        {
            if(strcmp(CPF, paciente[contP].CPF)== 0)
            {
                printf("Registro encontrado!\n");
                posicao = contP;
            }
            else
            {
                posicao = -1;
            }
            if(posicao = -1)
            {
                printf(" \n Registro não encontrado! ");
            }
            else
            {
                printf(" \n Registro Encontrado!\n");
                printf("CPF: %s", paciente[posicao].CPF);
            }
        }
    }
}
int main()
{
    int j;
    cadastroPaciente();
    Listar();
    printf("\n\n");
    int w,px,py,x;                            /* variáveis simples                       */
    HANDLE hOut;                              /* controle dos dispositivos do pc         */
    HBITMAP hb;
    long lg;
    hOut= GetStdHandle(STD_OUTPUT_HANDLE);    /* pega a saída padrão                     */
    CONSOLE_SCREEN_BUFFER_INFO SBInfo;        /* informações sobre a buffer da tela      */
    GetConsoleScreenBufferInfo(hOut, &SBInfo);/* pega a posição do cursor do console     */
    GetBitmapBits(hb,lg,NULL);
    px = SBInfo.dwCursorPosition.X;           /* pX será a posição da coluna do cursor no console */
    py = SBInfo.dwCursorPosition.Y;           /* pY será a posição da linha do cursor no console  */
    gotoxy_2(0,py+20);
    gotoxy_2(0,py+2 );
    for( j=0; j<10; j++ )
        desenha(40,py,carac2,j);  /* são os dígitos   */
    printf("\n\n\n\n");
    return 32768;
}
void Listar()
{
    int i;
    printf("esta no Listar !\n\n");
    for(i=0; i<contP; i++)
    {
        printf("Nome -------> %s", paciente[i].nomecompleto );
        printf("cpf --------> %s", paciente[i].CPF          );
        printf("celular ----> %s", paciente[i].telefone     );
        printf("Nascimento -> %s", paciente[i].datanasc     );
        printf("RG ---------> %s", paciente[i].RG           );
        printf("Email ------> %s", paciente[i].email        );
        printf("Endereco ---> %s", paciente[i].endereco     );
        printf("Cidade -----> %s", paciente[i].cidadeEestado);
    }
}
void            _Meu_Fflush()
{
    char c;
    while( c = fgetc(stdin) != '\n');
}
void desenha(int co_i, int li_i, int caract[],int w){
    int x,y,q,co,li;
    li=li_i;
    w *= 7;
    for(x=0;x<7;x++){                  /* linhas */
        co=co_i;
        q=caract[x+w];
        for(y=0;y<16;y += 2){              /* colunas */
            gotoxy_2(co,li);
            if(q % 2==0)printf("  ");
            else   printf("%c%c",219,219);
            co -= 2;
            q/=2;
        }
        li++;
    }
    gotoxy_2(70,li_i+7);
    Sleep(1000);
}
void gotoxy_2(int x, int y){/*imprimir na linha e coluna desejada */
  SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE),(COORD){x,y});
}

 

Eu só estou com problema nessa parte de mandar a função listar(); o restante do código eu fiz e está funcionando normal kk

  • Obrigado 1
Postado
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

int main(){
setlocale(LC_ALL, "");

    printf ("Inicializando sistema...");
    sleep(3);
    system("cls");
    login();







    return 0;
}

  void login(){

char loginA[7], senhaA[20], dloginA[9]="adminA", dsenhaA[20]="unipadminA";
char loginB[7], senhaB[20], dloginB[9]="adminB", dsenhaB[20]="unipadminB";
char loginC[7], senhaC[20], dloginC[9]="adminC", dsenhaC[20]="unipadminC";
char novasenha[20];

int unidade, redefinir_senha;

    volta:

printf("\nOpções disponíveis: 1, 2 e 3 ou digite 4 para redefinir a senha.");
printf("\nEscolha uma das opções disponíveis: ");
scanf("%d", &unidade);

switch(unidade){
case 1:
        printf("Você escolheu a unidade %d!\n", unidade);


    printf("LOGIN: ");
	scanf("%s",loginA);/*aqui você digita o login*/
	printf("SENHA: ");
	scanf("%s",senhaA);/*aqui você digita a senha*/
	if((strcmp(dloginA,loginA) == 0) && (strcmp(dsenhaA,senhaA) == 0)){
	    printf("\n\nLogin efetuado com sucesso!\n");
	}else{
	    printf("Usuário ou senha inválida!\n\n");
	    goto volta;
        };
	break;

case 2:
    printf("Você escolheu a unidade %d!\n", unidade);


    printf("LOGIN: ");
	scanf("%s",loginB);/*aqui você digita o login*/
	printf("SENHA: ");
	scanf("%s",senhaB);/*aqui você digita a senha*/
	if((strcmp(dloginB,loginB) == 0) && (strcmp(dsenhaB,senhaB) == 0)){
	    printf("\n\nLogin efetuado com sucesso!\n");
    }
    else{
	    printf("Usuário ou senha inválida!\n\n");
	    goto volta;
        };
    break;

case 3:
    printf("Você escolheu a unidade %d!\n", unidade);
    printf("LOGIN: ");
	scanf("%s",loginC);/*aqui você digita o login*/
	printf("SENHA: ");
	scanf("%s",senhaC);/*aqui você digita a senha*/
	if((strcmp(dloginC,loginC) == 0) && (strcmp(dsenhaC,senhaC) == 0)){
	    printf("\n\nLogin efetuado com sucesso!\n");
    }
    else{
	    printf("Usuário ou senha inválida!\n\n");
        goto volta;
        }
    break;

case 4:
    printf("Para redefinir sua senha, digite sua unidade: ");
    scanf("%d", &redefinir_senha);
    if(redefinir_senha == 1){
            printf("Digite sua nova senha: ");
            scanf("%s", &novasenha);
        novasenha == senhaA;
        printf("Sua senha foi alterada!");
        login();
}

    default:
        printf("Opção inválida!\n");
             goto volta;
             break;
             };



    printf ("Carregando o sistema...");
    sleep(3);
    system("cls");
    menuprincipal();

getch();
}
  
typedef struct{
    char nomecompleto[255];
    char datanasc[255];
    char CPF[255];
    char RG[255];
    char telefone[255];
    char email[255];
    char endereco[255];
    char cidadeEestado[255];
    char validacar[255];
    char convenio[255];
    char carteirinha[255];


}Cpaciente;
  
  Cpaciente paciente[MAXPACIENTES];
int contP = 0;
int posicao;



void cadastroPaciente(){
setlocale(LC_ALL, "");



FILE *arquivo;
arquivo = fopen("cadastro_paciente.bin", "ab");
int dados, retornar, i;
char fpag = 'P' || 'C';
char formapag[2];




    if(arquivo == NULL){
        printf("Erro ao abrir o arquivo.");
        };

        // INICIALIZAÇÃO DA STRUCT EM VETORES


        //ARMAZENANDO DADOS NAS STRUCT

        for(contP = 0; contP < MAXPACIENTES; contP++){

        printf("Você está na tela de cadastramento de pacientes.\n\n");
        fflush(stdin);
        printf("Digite o CPF: ");
        fgets(paciente[contP].CPF, 255, stdin);
        printf("Digite o Nome Completo: ");
        fgets(paciente[contP].nomecompleto, 255, stdin); // Função que lê o nome
        printf("Digite a data de nascimento(EX: DD/MM/AAAA): ");
        fgets(paciente[contP].datanasc, 255, stdin); // Função que lê a data de nasc
        printf("Digite o CPF novamente: ");
        fgets(paciente[contP].CPF, 255, stdin);
        fflush(stdin);
        printf("Digite o número do RG: ");
        fgets(paciente[contP].RG, 255, stdin); // Função que lê o RG
        printf("Digite o número do Telefone/Celular: ");
        fgets(paciente[contP].telefone, 255, stdin); // Função que lê o num de telefone
        printf("Digite o email: ");
        fgets(paciente[contP].email, 255, stdin); // Função que lê o email

        printf("Digite o endereço completo(EX: Rua, numCasa - Bairro): ");
        fgets(paciente[contP].endereco, 255, stdin); // Função que lê o endereço
        printf("Digite a Cidade e o Estado(EX: Cidade/Estado): ");
        fgets(paciente[contP].cidadeEestado, 255, stdin);
        printf("Particular ou Convênio? Informe com P ou C: ");
        scanf("%c", &fpag); // Função que lê a forma de pagamento informada pelo printf
        fpag = toupper(fpag);
        if(fpag == 'P'){
           printf("Digite D para Dinheiro ou C para Cartão.\n");
           printf("Forma de pagamento: ");
           scanf("%s", formapag); // Função que lê a forma de pagamento informada pelo printf
            }else if(fpag == 'C'){
            printf("Nome do Convênio: ");
            scanf("%s", paciente[contP].convenio); // Função que lê o nome do convenio
            printf("Digite o número da carteirinha: ");
            scanf("%s", &paciente[contP].carteirinha); // Função que lê o num da carteirinha
            printf("Data de validade da carteirinha(DD/MM/AAAA), não inserir se já estiver vencida!: ");
            scanf("%s", paciente[contP].validacar); // Função que lê a validade da carteirinha
            }

        printf("Os dados estão corretos? Digite 1 para SIM ou 2 para NÃO: ");
        scanf("%d", &dados);

        if(dados == 1){
            fwrite(&paciente[contP], sizeof(Cpaciente), 1, arquivo);
            contP = contP + 1;
            fclose(arquivo);
            printf("O paciente foi cadastrado com sucesso!\n");
            }else if(dados == 2){
            printf("Os dados não foram cadastrados!\n");
            }



    printf("Voltar ao menu principal? Digite 1 ou para sair digite 0: ");
    scanf("%d", &retornar);
        if(retornar == 1){
            system("cls");
            menuprincipal();
        }else if(retornar == 0){
            exit(1);
        }
    }

}
                                            
void consultaCadastro(FILE *arquivo){


arquivo = fopen("cadastro_paciente.txt","rb");


char CPF[255];


printf("VOCÊ ESTÁ NA TELA DE CONSULTAR CADASTRO\n\n");

printf("Para encontrar o registro, digite o número do CPF: ");
fflush(stdin);
gets(CPF);


const int info = fread(&paciente, sizeof(Cpaciente), MAXPACIENTES, arquivo);

if (info != MAXPACIENTES)
{
	/* Gerenciar o erro adequadamente aqui */
	printf("ERRO");
}

for(contP = 0; contP < MAXPACIENTES; contP++){
    if(strcmp(CPF, paciente[contP].CPF)== 0){
        printf("Registro encontrado!\n");
        posicao = contP;
        }else{
        posicao = -1;
        }
    if(posicao = -1) {
    printf(" \n Registro não encontrado! ");
    }else{
    printf(" \n Registro Encontrado!\n");
    printf(": %s", paciente[posicao].CPF);

    }



}




}

Aí está o código completo, foi como eu disse sou iniciante em C e me perdoe se não pego essas dicas/sugestões que você me deu fácil.....Verifique se eu estou fazendo da maneira correta.@devair1010

  • Obrigado 1
Postado

 Esqueci de colocar ela, perdoe-me..

 

void menuprincipal(){
setlocale(LC_ALL, "");

// VARIÁVEL PARA ARMAZENAR A OPÇÃO DO MENU

int opcao;


do{ printf("| MENU PRINCIPAL DO SISTEMA |\n");
    printf("1 - Cadastro de pacientes.\n");
    printf("2 - Cadastro de médicos.\n");
    printf("3 - Consulta de cadastros.\n");
    printf("4 - Agendamento de consultas.\n");
    printf("5 - Cancelamento de consultas.\n");
    printf("6 - Agenda do dia.\n");
    printf("7 - Cadastro de funcionários.\n");
    printf("8 - Sugestões, reclamações e elogios.\n");
    printf("9 - Relatórios.\n");
    printf("10 - Sair\n");

    printf("Digite a opção desejada: ");
    scanf("%d", &opcao);
    system("cls");


    switch(opcao){

    case 1:
        cadastroPaciente();
        break;

    case 2:

        break;

    case 3:
        consultaCadastro();
        break;

    case 10:
        printf("\n\n Finalizando....");
        sleep(3);
        exit(1);


    default:
        printf("Opção inválida! Tente Novamente.\n\n");
        }

}while(opcao!=10);

 

adicionado 0 minutos depois

 Esqueci de colocar ela, perdoe-me.. @devair1010

 

void menuprincipal(){
setlocale(LC_ALL, "");

// VARIÁVEL PARA ARMAZENAR A OPÇÃO DO MENU

int opcao;


do{ printf("| MENU PRINCIPAL DO SISTEMA |\n");
    printf("1 - Cadastro de pacientes.\n");
    printf("2 - Cadastro de médicos.\n");
    printf("3 - Consulta de cadastros.\n");
    printf("4 - Agendamento de consultas.\n");
    printf("5 - Cancelamento de consultas.\n");
    printf("6 - Agenda do dia.\n");
    printf("7 - Cadastro de funcionários.\n");
    printf("8 - Sugestões, reclamações e elogios.\n");
    printf("9 - Relatórios.\n");
    printf("10 - Sair\n");

    printf("Digite a opção desejada: ");
    scanf("%d", &opcao);
    system("cls");


    switch(opcao){

    case 1:
        cadastroPaciente();
        break;

    case 2:

        break;

    case 3:
        consultaCadastro();
        break;

    case 10:
        printf("\n\n Finalizando....");
        sleep(3);
        exit(1);


    default:
        printf("Opção inválida! Tente Novamente.\n\n");
        }

}while(opcao!=10);

 

adicionado 1 minuto depois
2 minutos atrás, devair1010 disse:

@Gegê82737     esse nem compila e está faltando a função menuprincipal ..

Foi como te falei, o restante do código está funcionando normal só estou me complicando nessa função consultaCadastro(); ..... 

  • Curtir 1
Postado

Todos os campos de sua estrutura são char.

  • Não há razão pra usar scanf(). Só vai ter problemas. Faça o simples e leia linha a linha com fgets(). 
  • Não leia os dados na rotina que insere. São coisas diferentes. Só vai dar problema.
  • Se vai gravar texto apenas, use fprintf() ou fputs(). É muito mais fácil e ainda pode abrir o arquivo de saída no IDE para testar. Não há razão para usar um arquivo binário de texto ;) porque afinal é texto.
  • Não há razão para escrever o programa já com 11 onze campos. Teste apenas com dois ou tres. Ninguém vai culpar você. Se acertar com os dois vai acertar com 2 mil. Mas é muito chato testar com onze numa estrutura de incriveis 3K cada uma. Para que? 255 bytes para a cidade está bem até para os nomes da Islândia. mas uns 10 já estriam bem no teste.
  • Se tem um função menu() porque razão não ler a opção lá dentro e retornar??????? É o simples: e tira esse código todo de main()
     
  •     opcao = menu();
        switch(opcao)
        {
            default:
                break;
        }

     

  • main() deve ser a primeira função em seu programa. SEMPRE. Se possível em um arquivo separado.
  • Em geral para percorrer essas estruturas em programas comuns você inicialmente tenta ler um arquivo com o estado inicial dos dados
    • depois você carrega o vetor todo para a memória e roda o programa a partir desses dados
    • ao final você grava no disco em outro arquivo todos os dados
    • muda o nome do arquivo original
    • muda o nome do arquivo gerado para o nome oficial
       
Strcpy(paciente[contP].carteirinha, "NULL");
strcpy(paciente[contP].cidadeEestado, "NULL"); 
strcpy(paciente[contP].convenio, "NULL"); 
...

 

Não sei o que pretendia com isso, mas colocar o valor "NULL" é tem estranho. Poderia escrever apenas

        paciente[contP].carteirinha = 0;


E seria o equivalente a ter uma string vazia lá. NULL é 0, ou \0

 

Nunca use variáveis globais. Nunca mesmo. É problema e por isso é proibido em muitas empresas e escolas e condenado por todos autores.

 

 

 

 

  • Curtir 1
Postado
21 minutos atrás, arfneto disse:

Todos os campos de sua estrutura são char.

  • Não há razão pra usar scanf(). Só vai ter problemas. Faça o simples e leia linha a linha com fgets(). 
  • Não leia os dados na rotina que insere. São coisas diferentes. Só vai dar problema.
  • Se vai gravar texto apenas, use fprintf() ou fputs(). É muito mais fácil e ainda pode abrir o arquivo de saída no IDE para testar. Não há razão para usar um arquivo binário de texto ;) porque afinal é texto.
  • Não há razão para escrever o programa já com 11 onze campos. Teste apenas com dois ou tres. Ninguém vai culpar você. Se acertar com os dois vai acertar com 2 mil. Mas é muito chato testar com onze numa estrutura de incriveis 3K cada uma. Para que? 255 bytes para a cidade está bem até para os nomes da Islândia. mas uns 10 já estriam bem no teste.
  • Se tem um função menu() porque razão não ler a opção lá dentro e retornar??????? É o simples: e tira esse código todo de main()
     
  • 
        opcao = menu();
        switch(opcao)
        {
            default:
                break;
        }

     

  • main() deve ser a primeira função em seu programa. SEMPRE. Se possível em um arquivo separado.
  • Em geral para percorrer essas estruturas em programas comuns você inicialmente tenta ler um arquivo com o estado inicial dos dados
    • depois você carrega o vetor todo para a memória e roda o programa a partir desses dados
    • ao final você grava no disco em outro arquivo todos os dados
    • muda o nome do arquivo original
    • muda o nome do arquivo gerado para o nome oficial
       

Strcpy(paciente[contP].carteirinha, "NULL");
strcpy(paciente[contP].cidadeEestado, "NULL"); 
strcpy(paciente[contP].convenio, "NULL"); 
...

 

Não sei o que pretendia com isso, mas colocar o valor "NULL" é tem estranho. Poderia escrever apenas


        paciente[contP].carteirinha = 0;


E seria o equivalente a ter uma string vazia lá. NULL é 0, ou \0

 

Nunca use variáveis globais. Nunca mesmo. É problema e por isso é proibido em muitas empresas e escolas e condenado por todos autores.

 

 

 

 

Tem algum problema de todos os campos serem char na minha estrutura? Qual formato de variável eu deveria usar para ler um número grande? Tipo o CPF? 

  • Curtir 1
Postado
2 horas atrás, Gegê82737 disse:

Tem algum problema de todos os campos serem char na minha estrutura? Qual formato de variável eu deveria usar para ler um número grande? Tipo o CPF?


Não, não tem nenhum problema. É bem conveniente até. 

 

O CPF não é um número. Não deve ler como tal. Ninguém opera com CPF. O que se faz com CPF é

 

  • testar os dois dígitos verificadores. Tem vários exemplos aqui nesse forum de como fazer isso. Eu por exemplo postei vários, em C e C++, afinal se o cara entrou com um número inválido normalmente você não vai por em um cadastro.
  • usar como  "chave" para ver se já tem o registro no cadastro. 
  • Colocar na tela, e nesse caso será quase certamente da forma "abc.def.ghi-jk" que é char[15]. Como te disse, char[255] é exagerado até para aos nomes das Islândia :) 

Entendeu as outras coisas que eu expliquei? Seu programa está muito complicado sem necessidade.

  • Curtir 1
Postado
16 minutos atrás, Gegê82737 disse:

Só estou tentando buscar os dados da struct individualmente ainda

 

Não use campos da struct individualmente para ler e gravar no disco. O propósito de criar uma struct é justamente poder manipular como conjunto.

  • Curtir 1
  • Obrigado 1
Postado
24 minutos atrás, Gegê82737 disse:

É porque o meu objetivo é gravar os dados em arquivo e depois fazer uma busca do arquivo mas essa busca eu gostaria de fazer por exemplo, pelo nome. 

 

É claro, mas não via nunca ler campo a campo do disco. Leu mesmo o que eu expliquei? Em geral você lê e grava todo o cadastro de e para a memória. Nada tem a ver com o que vai fazer com os dados. Apenas o conjunto.

  • Curtir 1

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