Ir para conteúdo
Fórum Script Brasil
  • 0

Structure


krs123

Pergunta

Boas, galera tenho um problema, estou tentando criar um programa que escreva para e leia de um ficheiro, acontece que consigo escrever para o ficheiro, mas o contéudo não é nada daquilo que eu escrevo na tela e quando faço o printf para o ecrã surge numeros como se fosse registos de memória alguém me pode ajudar.

Obrigado.

#include <stdio.h>
#define ESPACO 50
#define FICH "consulta.txt"

typedef struct consulta
{
   int numero;
   char nome[20];
   char especialidade[20];
   int data;
   int hora;
   int contacto;
}  CONSULTA;

int main() {

    char opcao;

 CONSULTA hospital[ESPACO], tabela;
    int getConsulta = 0, i, j;
    FILE *fp;
    while(1) {
        printf("\n\nDev Testes\n");
        printf("1 - Inserir Consulta\n");
        printf("2 - Listar\n");
        printf("3 - Ordenar por número\n");
        printf("4 - Ordenar por nome\n");
        printf("5 - Gravar para ficheiro\n");
        printf("6 - Ler de ficheiro\n");
        printf("7 - Sair\n");
        printf("8 - Remover Consulta\n\n");
         rewind(stdin);     /* reinicio do ficheiro */
        opcao = getchar();
        switch(opcao) {
            case '1': {
                printf("Número: ");
                scanf("%s", hospital[getConsulta].numero);
                printf("Nome: ");
                scanf("%s", hospital[getConsulta].nome);
                printf("Especialidade: ");
                scanf("%s", hospital[getConsulta].especialidade);
                printf("Data: ");
                scanf("%s", hospital[getConsulta].data);
                printf("Hora: ");
                scanf("%s", hospital[getConsulta].hora);
                printf("Contacto: ");
                scanf("%s", hospital[getConsulta].contacto);

                rewind(stdin);
                getConsulta++;
                }
                break;
    /* Faz o display no ecrã dos dados recolhidos*/
                case '2': {
         for(i=0; i<getConsulta; i++) {

                printf("Numero: %u\n",&hospital[getConsulta].numero);
                printf("Nome: %u\n",&hospital[getConsulta].nome);
                printf("Especialidade: %u\n",&hospital[getConsulta].especialidade);
                printf("Data: %u\n",&hospital[getConsulta].data);
                printf("Hora: %u\n",&hospital[getConsulta].hora);
                printf("Contacto: %u\n",&hospital[getConsulta].contacto);

                     }
       }
                break;
    /* Ordenar por numero*/
             case '3': {
                    for(i=0; i<getConsulta; i++){
                        for(j=0; j<getConsulta-i-1; j++){
                            if(hospital[j].numero > hospital[j+1].numero) {
                                tabela = hospital[j];
                                hospital[j] = hospital[j+1];
                                hospital[j+1] = tabela;
                            }
                        }
                    }
                }
                break;
    /* Ordenar por nome*/
            case '4': {
                    for(i=0; i<getConsulta; i++){
                        for(j=0; j<getConsulta-i-1; j++){
                            if( strcmp(hospital[j].nome, hospital[j+1].nome)==1 ) {
                                tabela = hospital[j];
                                hospital[j] = hospital[j+1];
                                hospital[j+1] = tabela;
                            }
                        }
                    }
                }
                break;
    /* Gravar para ficheiro*/
            case '5': {
                 fp = fopen(FICH, "w");
                 fwrite(&getConsulta, sizeof(int), 1, fp);
                 fwrite(hospital, sizeof(CONSULTA), ESPACO, fp);
                 fclose(fp);
                }

                break;
    /* Ler o ficheiro*/
            case '6': {
                 fp = fopen(FICH, "r");
                 fread(&getConsulta, sizeof(int), 1, fp);
                 fread(hospital, sizeof(CONSULTA), ESPACO, fp);
                 fclose(fp);

                }
                break;
    /* Sair */
            case '7':
                exit(0);
        }
     }
 }

Editado por krs123
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Ei! Você removeu o código porquê?

Como ontem eu havia copiado o código, eu consegui testá-lo e hoje voltei para responder!

Seguem abaixo meus comentários e o código funcionando:

1) Para usar a função exit inclua stdlib.h

2) Ao utilizar o scanf você estava passando o formato sempre como "%s" mesmo quando você queria ler uma variável do tipo int

3) No scanf, quando você passa como parâmetro um vetor sem o seu índice, você não deve usar o operador &

Bem, não tenho mais o seu código original e por isso eu só me lembrei destes três pontos no seu código. A seguir um código que funciona!

#include <stdio.h>
#include <stdlib.h>

#define ESPACO 200
#define FICH "consulta.txt"

typedef struct consulta
{
   int numero;
   char nome[20];
   char especialidade[20];
   int data;
   int hora;
   int contacto;
}  CONSULTA;

int main() {

    char opcao;

    CONSULTA hospital[ESPACO], tabela;
    int nConsulta = 0, i, j;
    FILE *fp;
    while(1) {
        printf("\n\nDev Testes\n");
        printf("1 - Inserir Consulta\n");
        printf("2 - Listar\n");
        printf("3 - Ordenar por número\n");
        printf("4 - Ordenar por nome\n");
        printf("5 - Gravar para ficheiro\n");
        printf("6 - Ler de ficheiro\n");
        printf("7 - Sair\n");
        printf("8 - Remover Consulta\n\n");
        rewind(stdin);     /* reinicio do ficheiro */
        opcao = getchar();
        switch(opcao) {
            case '1': {
                printf("Número: ");
                scanf("%d", &hospital[nConsulta].numero);
                printf("Nome: ");
                scanf("%s",  hospital[nConsulta].nome);
                printf("Especialidade: ");
                scanf("%s",  hospital[nConsulta].especialidade);
                printf("Data: ");
                scanf("%d", &hospital[nConsulta].data);
                printf("Hora: ");
                scanf("%d", &hospital[nConsulta].hora);
                printf("Contacto: ");
                scanf("%d", &hospital[nConsulta].contacto);
                rewind(stdin);
//                nConsulta++;
                }
                break;
    /* Faz o display no ecrã dos dados recolhidos*/
                case '2': {
                    /*  for(i=0; i<nConsulta; i++) {*/

                printf("Numero: %d\n",        hospital[nConsulta].numero);
                printf("Nome: %s\n",          hospital[nConsulta].nome);
                printf("Especialidade: %s\n", hospital[nConsulta].especialidade);
                printf("Data: %d\n",          hospital[nConsulta].data);
                printf("Hora: %d\n",          hospital[nConsulta].hora);
                printf("Contacto: %d\n",      hospital[nConsulta].contacto);

                     /*}*/
                }
                break;
    /* Ordenar por numero*/
             case '3': {
                    for(i=0; i<nConsulta; i++){
                        for(j=0; j<nConsulta-i-1; j++){
                            if(hospital[j].numero > hospital[j+1].numero) {
                                tabela = hospital[j];
                                hospital[j] = hospital[j+1];
                                hospital[j+1] = tabela;
                            }
                        }
                    }
                }
                break;
    /* Ordenar por nome*/
            case '4': {
                    for(i=0; i<nConsulta; i++){
                        for(j=0; j<nConsulta-i-1; j++){
                            if( strcmp(hospital[j].nome, hospital[j+1].nome)==1 ) {
                                tabela = hospital[j];
                                hospital[j] = hospital[j+1];
                                hospital[j+1] = tabela;
                            }
                        }
                    }
                }
                break;
    /* Gravar para ficheiro*/
            case '5': {
                 fp = fopen(FICH, "wb");
                 fwrite(&nConsulta, sizeof(int), 1, fp);
                 fwrite(hospital, sizeof(CONSULTA), ESPACO, fp);
                 fclose(fp);
                }

                break;
    /* Ler o ficheiro*/
            case '6': {
                 fp = fopen(FICH, "rb");
                 fread(&nConsulta, sizeof(int), 1, fp);
                 fread(hospital, sizeof(CONSULTA), ESPACO, fp);
                 fclose(fp);
                }
                break;
    /* Sair */
            case '7':
                exit(0);
        }
     }
}

Link para o comentário
Compartilhar em outros sites

  • 0

Não querendo abusar, mas isto é questões de principiantes, de momento tá tudo a funcionar beleza, mas já não faz a incrementação de dados, mesmo quando tiro o comment no código o output dos dados na tela surgem a zero, isso poderá ser pelo facto de o código ao correr apaga o que está em memória antes de escrever quando faz o nConsulta++.

Abração Marcelo, é bom saber que existem foruns que de facto auxiliam os principiantes.

Link para o comentário
Compartilhar em outros sites

  • 0

Que isso, não há problema algum! E é sempre bom ajudar pois, se hoje eu sei, é porque algum dia alguém me ensinou! :)

Não entendi exatamente o que está acontecendo mas, pelo código acima, apenas descomentar o código que incrementa nConsulta não irá resolver. Desta forma a posição que será exibida será sempre uma além da última!

Para que os dados sejam exibidos a opção de listar tem que ficar como abaixo:

/* Faz o display no ecrã dos dados recolhidos*/
                case '2': {
                     for(i=0; i<nConsulta; i++) {
                          printf("Numero: %d\n",        hospital[i].numero);
                          printf("Nome: %s\n",          hospital[i].nome);
                          printf("Especialidade: %s\n", hospital[i].especialidade);
                          printf("Data: %d\n",          hospital[i].data);
                          printf("Hora: %d\n",          hospital[i].hora);
                          printf("Contacto: %d\n",      hospital[i].contacto);
                     }
                }
                break;

Note que foi descomentado o loop for e o índice do vetor foi alterado para o contador i.

Abraços e boa sorte!

Qualquer dúvida é só falar... :)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...