johnny244 Posted January 2, 2017 at 05:10 PM Report Share #601671 Posted January 2, 2017 at 05:10 PM 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 More sharing options...
HappyHippyHippo Posted January 2, 2017 at 05:35 PM Report Share #601674 Posted January 2, 2017 at 05:35 PM que queres dizer que "não lê o ficheiro" ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
johnny244 Posted January 2, 2017 at 05:43 PM Author Report Share #601678 Posted January 2, 2017 at 05:43 PM 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. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 2, 2017 at 05:50 PM Report Share #601680 Posted January 2, 2017 at 05:50 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
johnny244 Posted January 2, 2017 at 05:58 PM Author Report Share #601681 Posted January 2, 2017 at 05:58 PM 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. Link to comment Share on other sites More sharing options...
johnny244 Posted January 2, 2017 at 06:01 PM Author Report Share #601682 Posted January 2, 2017 at 06:01 PM ele grava algo no ficheiro, agr não sei se o problema esta no gravar ou no ler. nao percebi bem a tua pergunta. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 2, 2017 at 06:05 PM Report Share #601685 Posted January 2, 2017 at 06:05 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
johnny244 Posted January 2, 2017 at 06:47 PM Author Report Share #601687 Posted January 2, 2017 at 06:47 PM 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 More sharing options...
johnny244 Posted January 2, 2017 at 07:11 PM Author Report Share #601689 Posted January 2, 2017 at 07:11 PM pelo menos gostava que me dissesses em que função está o problema, não quero respostas dadas, mas pelo menos mais alguma pista. Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted January 2, 2017 at 07:40 PM Report Share #601691 Posted January 2, 2017 at 07:40 PM 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 More sharing options...
johnny244 Posted January 2, 2017 at 08:37 PM Author Report Share #601695 Posted January 2, 2017 at 08:37 PM 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 More sharing options...
HappyHippyHippo Posted January 2, 2017 at 09:47 PM Report Share #601698 Posted January 2, 2017 at 09:47 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted January 2, 2017 at 10:00 PM Report Share #601702 Posted January 2, 2017 at 10:00 PM 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 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 2, 2017 at 10:05 PM Report Share #601703 Posted January 2, 2017 at 10:05 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted January 2, 2017 at 10:07 PM Report Share #601704 Posted January 2, 2017 at 10:07 PM (edited) 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 January 2, 2017 at 10:58 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
johnny244 Posted January 2, 2017 at 11:08 PM Author Report Share #601713 Posted January 2, 2017 at 11:08 PM "numAlunosInseridos = ftell(f)/sizeof(T_ALUNO);"conta os registos que estão no ficheiro penso eu, e atribui esse valor á variavel numAlunosInseridos Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 2, 2017 at 11:11 PM Report Share #601714 Posted January 2, 2017 at 11:11 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
johnny244 Posted January 2, 2017 at 11:28 PM Author Report Share #601716 Posted January 2, 2017 at 11:28 PM 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. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 2, 2017 at 11:31 PM Report Share #601717 Posted January 2, 2017 at 11:31 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
johnny244 Posted January 2, 2017 at 11:35 PM Author Report Share #601718 Posted January 2, 2017 at 11:35 PM ela ficou armazenada na variavel mas foi na função abrirFich,por isso penso que nao. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now