Jump to content

Ficheiro binário


johnny244

Recommended Posts

Boa tarde, sei que ja existe bastantes topicos sobre o assunto, mas nao consegui esclarecer a minha duvida na mesma.

 

Deixo abaixo o código do respectivo programa.

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

#define LIM 31
#define TAMUC 60
#define MAXNOME 30

typedef struct
{
    int numAluno;
    char nome[MAXNOME];
    int notafinal;
} T_ALUNO;

FILE *f;

//Prototipo das funçoes
int MenuOpcoes(void);
T_ALUNO ler_dados_estudante(void);
void mostra_Dados_Alunos(T_ALUNO aluno);
void mostrar_dados_estudantes(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos);
int Alterar_nota_Aluno(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos);
void mostrar_estatisticas(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos);
void gravar_ficheiro(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos);
int AbrirFich(int numAlunosInseridos);
void Mostrar(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos);
int ler_ficheiro(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos);

void  main(void)
{
    T_ALUNO vetorAlunos[TAMUC];
    int numAlunosInseridos = 0, opcao, numAlunoAmostrar, i;

    do
    {
        opcao = MenuOpcoes();

        switch(opcao)
        {
        case 1:
            vetorAlunos[numAlunosInseridos] = ler_dados_estudante();
            numAlunosInseridos++;
            system("cls");
            break;
        case 2:
            mostrar_dados_estudantes(vetorAlunos, numAlunosInseridos);
            system("pause");
            system("cls");
            break;

        case 3:
            numAlunosInseridos = Alterar_nota_Aluno(vetorAlunos, numAlunosInseridos);
            system("pause");
            system("cls");
            break;
        case 4:
            mostrar_estatisticas(vetorAlunos, numAlunosInseridos);
            system("pause");
            system("cls");
            break;
        case 5:
            gravar_ficheiro(vetorAlunos, numAlunosInseridos);
            system("pause");
            system("cls");
            break;
        case 6:
            ler_ficheiro(vetorAlunos, numAlunosInseridos);
            system("pause");
            system("cls");
            break;

        }
    }
    while(opcao != 0);





    return 0;
}

T_ALUNO ler_dados_estudante(void)

{
    T_ALUNO novoAluno;
    printf("Num. aluno: ");
    scanf(" %d", &novoAluno.numAluno);

    printf("Nome: ");
    scanf(" %[^\n]s", novoAluno.nome);

    do
    {
        printf("Nota Final: ");
        scanf("%d", &novoAluno.notafinal);

        if (novoAluno.notafinal < -1 || novoAluno.notafinal > 20)
            printf("\n\nNota invalida.\n");
    }
    while (novoAluno.notafinal < -1 || novoAluno.notafinal > 20);

    return novoAluno;
}

void mostrar_dados_estudantes(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos)
{
    int i;

    for(i=0; i<numAlunosInseridos; i++)
    {
        mostra_Dados_Alunos(vetorAlunos[i]);
    }
}
void mostra_Dados_Alunos(T_ALUNO aluno)
{
    printf("Numero Aluno: %d \n Nome do Aluno: %s \n Nota Final: %d \n\n", aluno.numAluno, aluno.nome, aluno.notafinal);
}

int Alterar_nota_Aluno(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos)
{
    int numAlunoAlterar, i, j;
    printf("Num Aluno: ");
    scanf("%d", &numAlunoAlterar);

    for(i=0; i<numAlunosInseridos; i++)
    {
        if(vetorAlunos[i].numAluno == numAlunoAlterar)
        {
            do
            {
                printf("Nota Final: ");
                scanf("%d", &vetorAlunos[i].notafinal);

                if (vetorAlunos[i].notafinal < -1 || vetorAlunos[i].notafinal > 20)
                    printf("\n\nNota invalida.\n");
            }
            while (vetorAlunos[i].notafinal < -1 || vetorAlunos[i].notafinal > 20);

            return numAlunosInseridos;
        }
    }

}

void mostrar_estatisticas(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos)
{
    int i, somaNotas = 0, maior = -1, menor = 21, cont=0;
    float media,percentagem = 0;

    for(i=0; i< numAlunosInseridos; i++)
    {
        somaNotas += vetorAlunos[i].notafinal;
    }
    //Media
    media = (float)somaNotas/numAlunosInseridos;

    printf("\nA media das Notas: %.2f \n", media);

    //Nota mais alta
    for (i = 0; i < numAlunosInseridos; i++)

        if (vetorAlunos[i].notafinal > maior)
        {
            maior = vetorAlunos[i].notafinal;
        }

    printf("\n A nota mais alta e: %d \n", maior);

    //Nota mais baixa
    for (i = 0; i < numAlunosInseridos; i++)
        if (vetorAlunos[i].notafinal < menor)
            menor = vetorAlunos[i].notafinal;

    printf("\n A nota mais Baixa e: %d \n", menor);


    for(i=0; i< numAlunosInseridos; i++)

        if (vetorAlunos[i].notafinal >= 10)
            cont = cont+1;
    percentagem = ((float)cont/numAlunosInseridos)*100;
    printf("\nA percentagem de notas positivas e: %.0f %% \n", percentagem);

}

void gravar_ficheiro(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos)
{

    FILE *f;
    int i;

    f=fopen("aluno.dat", "wb");
    if(f==NULL)
    {
        printf("Ocorreu um erro!");
    }
    else
    {

        for(i=0; i< numAlunosInseridos; i++)
        {
            fwrite(&vetorAlunos, sizeof(T_ALUNO), 1, f);

        }




    }

    fclose(f);


}

int AbrirFich(int numAlunosInseridos)
{
    if ((f=fopen("aluno.dat","rb"))==NULL)
        return 0;
    fseek(f,0,SEEK_END);
    numAlunosInseridos = ftell(f)/sizeof(T_ALUNO);
    printf("\nExistem %d registos\n",numAlunosInseridos);
    return -1;
}

void Mostrar(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos)
{
    int i;

    rewind(f);
    for(i=0; i< numAlunosInseridos; i++)
    {
        fread(&vetorAlunos, sizeof(T_ALUNO), 1, f);
        printf("\nNumero    : %d \n ", vetorAlunos[i].numAluno);
        printf("\nNome : %s\n", vetorAlunos[i].nome);
        printf("\nNota Final : %d\n", vetorAlunos[i].notafinal);
    }
    printf("\n");
}


int ler_ficheiro(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos)
{
    char op;
    if (AbrirFich(numAlunosInseridos)==0)
    {
        printf("Ficheiro não existe\n");
        exit(1);
    }

    do
    {
        printf("m=Mostrar  s=Sair\n");
        scanf(" %c", &op);
        switch (op)
        {
        case 'm':
            Mostrar(vetorAlunos, numAlunosInseridos);
            break;
        case 's':
            break;
        default:
            printf("opção inválida!");
        }
    }
    while (op != 's');

    fclose(f);


}


int MenuOpcoes(void)
{
    int opcao;
    do
    {

        printf("1 - Inserir dados dos estudantes \n");
        printf("2 - Mostrar dados dos estudantes\n");
        printf("3 - Alterar notas finais dos estudantes \n");
        printf("4 - Estatisticas das avaliacoes\n");
        printf("5 - Gravar dados em ficheiro\n");
        printf("6 - Ler dados de ficheiro \n");
        printf("0 - Sair");
        printf("\nOpcao: ");
        scanf("%d", &opcao);

        if(opcao < 0 || opcao > 6)
        {
            printf("Opcao inválida!");
        }
    }
    while(opcao < 0 || opcao > 6);

    return opcao;
}

Neste caso a minha duvida é a seguinte, quando executo o programa e insiro alunos e logo a seguir  gravar e ler posteriormente o ficheiro, o programa lê sem problemas o ficheiro. 

Mas quando executo o programa e escolho logo a opção para ler o ficheiro, ele não lê dados do ficheiros.

Obrigado a quem se disponibilizar a ajudar. 

Link to comment
Share on other sites

  • Replies 45
  • Created
  • Last Reply

Top Posters In This Topic

quando faço para ler supostamente escolho a opçao pa ler que vai utilizar a funcao AbrirFich caso exista um ficheiro. se existir diz me o tamanho do ficheiro penso eu, e da me a opçao para mostrar os dados ou sair do programa, caso escolha'm' usa a funçao mostrar, onde acho que é o sitio que esta o problema. tenho estado a tentar de varias maneiras mas n consigo la chegar,

Link to comment
Share on other sites

Acho que ao que o @HappyHippyHippo se refere deve ser nesta função:

int ler_ficheiro(T_ALUNO vetorAlunos[TAMUC], int numAlunosInseridos)
{
    char op;
    if (AbrirFich(numAlunosInseridos)==0)
    {
        printf("Ficheiro não existe\n");
        exit(1);
    }

    do
    {
        printf("m=Mostrar  s=Sair\n");
        scanf(" %c", &op);
        switch (op)
        {
        case 'm':
            Mostrar(vetorAlunos, numAlunosInseridos);
            break;
        case 's':
            break;
        default:
            printf("opção inválida!");
        }
    }
    while (op != 's');

    fclose(f);


}

Explica, passo a passo, o que faz esta função! Deve ser a isso que o @HappyHippyHippo se refere!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to comment
Share on other sites

já ando nisto a dias, e criei um tópico foi porque dificilmente la vou chegar sozinho neste momento. eu sei que o programa grava o ficheiro, bem ou mal nao sei. tal cm nao sei se não lê pq as funções estão mal ou porque a função  onde gravo esta mal. preciso de esclarecer isto cm alguma urgência. estou farto de ver outros exemplos e percebo como funciona mas não estou a conseguir adaptar ao meu programa. eu ja expliquei

Link to comment
Share on other sites

2 hours ago, johnny244 said:

opçao pa ler que vai utilizar a funcao AbrirFich caso exista um ficheiro. se existir diz me o tamanho do ficheiro penso eu

da-te o tamanho do ficheiro ? qual a linha de código que faz isso ?

ps : estive no ginásio, mas agora estou em casa e se responderes às questões, vais ver que chegas rápido à solução

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

52 minutes ago, HappyHippyHippo said:

ainda não chegaste onde quero chegar ? é porque ainda não viste o problema

Com certeza ainda não.

Quando vi a thread pela primeira vez pensei qe pudesse ser o uso do fseek nos locais incorrectos. Só depois vi o rewind na outra função, portanto não deve ser por aí!

 

@johnny244, segue as indicações do @HappyHippyHippo que acabas por lá chegar!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.