Ir ao conteúdo
  • Cadastre-se

C Como faço para listar pessoas?


Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

#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
Link para o comentário
Compartilhar em outros sites

 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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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