Ir ao conteúdo
  • Cadastre-se
Pedro Zanutto

RESOLVIDO Problema com arquivos

Recommended Posts

Olá pessoal, sou novo no fórum, entrei na universidade esse ano no curso de Eng. Computação e de praxe já venho com meu primeiro post sendo uma dúvida. Vamos lá:

 

O código é esse

 

#include <stdio.h>
#include <stdlib.h>
 
int main(){
    FILE *fin;
    char nome[10][40];
    float n1[10], n2[10], media[10], geral = 0;
    int i, j;
 
    fin = fopen("alunos.txt", "r");
 
    for(i = 0; !feof(fin); i++){
        fgets(nome, 40, fin);
        fscanf(fin, "%f", &n1);
        fscanf(fin, "%f", &n2);
        fscanf(fin, "%f", &media);
        geral += media;
    }
 
    for(j = 0; j <= i; j++){
        printf("Nome do aluno: %s\n", nome[j]);
        printf("Notas: %.2f  %.2f\n", n1[j], n2[j]);
        printf("Media do aluno: %.2f", media[j]);
        printf("\n -------------------------------- \n");
    }
 
    printf("\n\nMedia da sala: %.2f", geral/10);
 
    fclose(fin);
 
    return 0;
}
 
 
E o problema é que quando o programa roda, ele imprime assim:
 
---------------------
Nome do aluno: nome
Notas: n1 n2
Media: media
---------------------
(tudo certo até então)
Nome do aluno: (VAZIO)
Notas: repete as de cima
Media: repete as de cima
----------------------
Nome do aluno: nome2
Notas: n1 n2 (novos)
Média: media (nova)
----------------------
(tudo certo novamente)

Nome do aluno: (VAZIO)
Notas: repete as de cima
Media: repete as de cima
----------------------
 
Media da sala: geral/10 (valor correto)
 
--
 
Sugestões?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá tudo bem?!

Qual é sua intenção com o código?! ele deve fazer exatamente o que?!

 

sugestão tente obter as informações e escrever as mesmas no mesmo laço do J ( não sei se seria uma boa pratica de programação ) mas ao menos para saber se esta funcionando ou não.

*Mas caso queria também daria para fazer:

/// exemplo de resolução.        int cont = 0; /// conta quantas vezes percorre o laço.    for(i = 0; !feof(fin); i++){        fgets(nome[i], 40, fin);        fscanf(fin, "%f", &n1[i]);        fscanf(fin, "%f", &n2[i]);        fscanf(fin, "%f", &media[i]);        geral += media[i];        cont++;    }     for(j = 0; j <= cont; j++){        printf("Nome do aluno: %s\n", nome[j]);        printf("Notas: %.2f  %.2f\n", n1[j], n2[j]);        printf("Media do aluno: %.2f", media[j]);        printf("\n -------------------------------- \n");    }

Att

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, foi mal a demora, eu tinha inicialmete já escrito no mesmo laço, porém como o resultado tinha sido o mesmo eu tentei separar pra ver se achava o erro. O programa é só um exercicios de uma lista antiga da faculdade que o professor recomendou:

 

6. Faça um programa que leia (do teclado) um cadastro de 10 alunos, indicando o nome, nota1, nota2.
Calcule a média aritmética simples dos 10 alunos e depois escreva em um arquivo texto os dados de
cada aluno: nome, nota1, nota2 e média. Lembre-se de que as notas e média deverão ser apresentadas
como valores que possuem até 2 casas após a vírgula.
 
7. Faça um programa que leia os dados gerados pelo programa anterior do exercício 6 e mostre na tela as
informações referentes aos alunos, calculando também a média geral da turma. LEMBRETE: É bem
mais fácil armazenar informações em arquivos do tipo texto, colocando um dado em cada linha
(“imitando” a entrada de dados do teclado: dado <enter>, dado <enter>, dado <enter> ...).
 
O que eu estou tendo problema é o 7, mas como ele depende do 6 coloquei também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Incrementando: Emanoel, o que você sugeriu não funcionou, o resultado é um pouco diferente e continua errado.

Vai uma imagem do terminal:

bcv3.png

 

Acima ainda tem os dados do primeiro "aluno", do mesmo modelo. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz o seguinte copia e cola o conteúdo do arquivo de entrada (alunos.txt) aqui (usa tag [ code ], ou o botão Código pra postar), isso pode ser um simples problema de espaçamento entre os dados no arquivo de texto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta isso:

#include <stdio.h>#include <stdlib.h> int main(){    FILE *fin, *fout;    char nome[10][40];    float n1[10], n2[10], media[10], geral = 0;    int i, j;        fin = fopen("input.txt", "r");        for(i = 0; !feof(fin); i++){        fgets(nome[i], 40, fin);        fscanf(fin, "%f\n", &n1[i]);        fscanf(fin, "%f\n", &n2[i]);        fscanf(fin, "%f\n", &media[i]);        geral += media[i];    }     for(j = 0; j < i; j++){        printf("Nome do aluno: %s\n", nome[j]);        printf("Notas: %.2f  %.2f\n", n1[j], n2[j]);        printf("Media do aluno: %.2f", media[j]);        printf("\n -------------------------------- \n");    }     printf("\n\nMedia da sala: %.2f", geral/10);     fclose(fin);     return 0;}

Só o que mudei foi adicionar o '\n' no final dos "%f" dos fscanfs, e corrigi um erro do código, no segundo for j deve ir de 0 até i-1, portanto a condição é j < i, e não j <= i.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, valeu isrnick, funcionou direitinho. A parte do for eu até entendi o erro, mas poderia me explicar o que o \n nos scanf(s) mudaram pra dar certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×