Jump to content
johnny244

Ficheiro binário

Recommended Posts

johnny244

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. 

Edited by johnny244

Share this post


Link to post
Share on other sites
johnny244

Quero dizer que seleciono a opcao "m" para mostrar e nao mostrar dados nenhuns. neste caso se fechar o programa e voltar a abrir e for logo directamente à opção para ler o ficheiro. 

Share this post


Link to post
Share on other sites
HappyHippyHippo

vamos por passinhos para ver se chegas lá, e para isso vais responder às minhas questões :

- diz por palavras tuas o qual é o primeiro passo que fazes no processo de leitura do ficheiro


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
johnny244

o que eu acho realmente é que o programa, nas circunstancias que digo que funciona, não lê o ficheiro. apenas mostra os dados porque os acabei de inserir. agora provavelmente há algo mal no código não sei é o que. 

Share this post


Link to post
Share on other sites
johnny244

ele grava algo no ficheiro, agr não sei se o problema esta no gravar ou no ler. nao percebi bem a tua pergunta.

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu sei qual é o problema, o que quero é que cheges à mesma conclusão, mas usando as tuas células cinzentas

a minha pergunta é  olhando par ao teu código, o que fazes quando dizes para ler o ficheiro ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
johnny244

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,

Share this post


Link to post
Share on other sites
johnny244

pelo menos gostava que me dissesses em que função está o problema, não quero respostas dadas, mas pelo menos mais alguma pista.

Share this post


Link to post
Share on other sites
PsySc0rpi0n

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

Share this post


Link to post
Share on other sites
johnny244

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

Share this post


Link to post
Share on other sites
HappyHippyHippo
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

Share this post


Link to post
Share on other sites
PsySc0rpi0n

Ele devia querer dizer "número de registos no ficheiro"... Digo eu! Pelo menos é o que eu entendo!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
HappyHippyHippo
5 minutes ago, PsySc0rpi0n said:

Ele devia querer dizer "número de registos no ficheiro"... Digo eu! Pelo menos é o que eu entendo!

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


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PsySc0rpi0n
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

Share this post


Link to post
Share on other sites
johnny244

"numAlunosInseridos = ftell(f)/sizeof(T_ALUNO);"conta os registos que estão no ficheiro penso eu, e atribui esse valor á variavel numAlunosInseridos

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok, dentro da função "AbrirFich" tens o número de elementos/registos no ficheiro

tens essa informação na função ler_ficheiro ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
johnny244

a funçao abrirFich e executada dentro da funcao ler_ficheiro para saber  se o ficheiro existe e o numero de registo no ficheiro e caso seja verdadeiro prosseguir para o case que vai dar a opçao de mostrar o conteudo do ficheiro. 

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

não respondeste á minha questão, a única coisa que tens de fazer é responder somente À minha questão, não te peço mais nada : "tens essa informação na função ler_ficheiro ?"


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
johnny244

ela ficou armazenada na variavel mas foi na função abrirFich,por isso penso que nao.

Share this post


Link to post
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.