Ir ao conteúdo

C Alocação de memória impedindo de ler o arquivo


Ir à solução Resolvido por igegedd,

Posts recomendados

  • Solução
Postado

Tipo, eu tentei alocar a memória pra minha struct

Ela tá declarada como Alunos A[TAM] (tam é o tamanho do vetor da struct)

ai quando vou alocar a memória pra ela usando struct Alunos *A =malloc(TAM*sizeof(struct Alunos));

ela não lê mais os dados do arquivo alunos.txt

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define TAM 116

typedef struct Alunos{
    char nome[50];
    int matricula;
    float notas[3];
    float media;
}Alunos;
struct Alunos A[TAM];

//FUNÇÕES
void imprimir_aluno(int i){
    printf("Aluno %d: %s\n",(i+1),A[i].nome);
}

void imprimir_notas(int i){
    printf("Notas finais: %0.1f, %0.1f, %0.1f\n",A[i].notas[0],A[i].notas[1],A[i].notas[2]);
}

void imprimir_matricula(int i){
    printf("Matricula: %d\n",A[i].matricula);
}

float media;
void imprimir_media(int i){
    media=(A[i].notas[0]+A[i].notas[1]+A[i].notas[2])/3.0;
    printf("Media do aluno: %0.1f\n",media);
}

void swap(Alunos *x,Alunos *y){
   struct Alunos tmp = *x;
    *x =*y;
    *y = tmp;
}

void Bubble_sort(Alunos *A, int n){
    int i, j;
    for (i = (n - 1); i > 0; i--) {
      for (j = 0; j < i; j++) {
         if (A[j].matricula > A[j + 1].matricula) {
            swap(&A[j], &A[j + 1]);
         }
      }
   }
}
int buscador;
Alunos BuscarAluno(int buscador,Alunos A[TAM]){
    Alunos a;
    int c=2;
    for(int i=0; i<TAM;i++){
        if(buscador==A[i].matricula){
            a=A[i];
            c=2;
            return a;
            break;
        }
    c = 1;
    }
    if(c != 2){
        a.matricula = -1;
        return a;
  }
}


int main(){
    FILE *arqalunos;
    if((arqalunos=fopen("alunos.txt","r+"))==NULL){
        printf("não foi possível abrir o arquivo.");
        system("pause");
        exit(1);
    }
    struct Alunos *A =malloc(TAM*sizeof(struct Alunos));
    if(A)
    if(arqalunos!=NULL){
        for(int i=0;i<TAM;i++){
            fscanf(arqalunos,"%d",&A[i].matricula);
            fscanf(arqalunos,"%s",&A[i].nome);
            fscanf(arqalunos,"%f",&A[i].notas[0]);
            fscanf(arqalunos,"%f",&A[i].notas[1]);
            fscanf(arqalunos,"%f",&A[i].notas[2]);
        }
    }
    int entrada,i,j;
    int busca;
    printf("Digite o numero de acordo com a opcao para imprimir:\n\n");
    printf("1- Elementos\n");
    printf("2- Nomes dos alunos\n");
    printf("3- Nome dos alunos e suas notas finais\n");
    printf("4- Buscar os dados de um aluno\n");
    printf("5- Alunos ordenados de acordo com a matricula\n");
    printf("6- Editar as notas do aluno (necessario busca)\n");
    printf("7- Matricula, nome e maior nota da turma\n");
    printf("8- Matricula, nome e menor nota da turma\n");
    printf("9- Alunos aprovados, reprovados e media geral da turma\n");
    printf("0- Sair do programa\n\n");
    do{
        scanf("%d",&entrada);
        setbuf(stdin,NULL);
        fflush(stdin);
        switch(entrada){
            case 1:
                for(i=0;i<TAM;i++){
                    imprimir_aluno(i);
                    imprimir_matricula(i);
                    imprimir_notas(i);
                    imprimir_media(i);
                    printf("\n");
                }
                printf("\n");
                break;

            case 2:
                for(i=0;i<TAM;i++){
                    imprimir_aluno(i);
                    printf("\n");
                }
                printf("\n");
                break;

            case 3:
                for(i=0;i<TAM;i++){
                    imprimir_aluno(i);
                    imprimir_notas(i);
                    imprimir_media(i);
                    printf("\n");
                }
                printf("\n");
                break;

            case 4:/*
                Struct
                printf("Digite o numero de Matricula:\n");
                scanf("%d",&buscador);
                a = BuscarAluno(buscador,A);
                if(A->matricula != -1){
                        imprimir_aluno(i);
                        imprimir_matricula(i);
                        imprimir_notas(i);
                        imprimir_media(i);
                }else{
                    printf("Matricula não foi encontrada\n");
                }*/
                break;

            case 5:
                for(i=0;i<TAM;i++){
                    Bubble_sort(A, TAM);
                    imprimir_aluno(i);
                    imprimir_matricula(i);
                    printf("\n");
                }
                printf("\n");
                break;

            case 6:
                printf("oil");
                break;

        }
    }while(entrada!=0);
    printf("Programa finalizado!");
    free(A);
    return 0;
}

 

alunos.txt

  • Curtir 1
Postado

@voicewp Sempre deixe a main() como a primeira função no seu programa. Acima dela apenas os protótipos.

 

2 horas atrás, voicewp disse:

Tipo, eu tentei alocar a memória pra minha struct

Ela tá declarada como Alunos A[TAM] (tam é o tamanho do vetor da struct)

ai quando vou alocar a memória pra ela usando struct Alunos *A =malloc(TAM*sizeof(struct Alunos));

ela não lê mais os dados do arquivo alunos.txt

Seria melhor se não declarasse nada global, fica difícil ter um controle e saber exatamente onde está usando a variável.

O que fez com "struct Alunos A[TAM]" foi declarar um vetor estático, a memória já foi alocada e não vai conseguir alocar nada. O que está atrapalhando é que na main() você declarou outra variável com o mesmo nome.

 

2 horas atrás, voicewp disse:
    struct Alunos *A =malloc(TAM*sizeof(struct Alunos));
    if(A)

NULL pode ser definido pela implementação como um 0, ou por uma expressão com type cast como (void*) 0. De qualquer forma seria melhor fazer a comparação A != NULL.

 

2 horas atrás, voicewp disse:
        scanf("%d",&entrada);
        setbuf(stdin,NULL);
        fflush(stdin);

Saberia me dizer o motivo das duas funções abaixo da scanf()? Essas funções não servem para serem usadas com a stdin e nem precisa delas nesse caso.

Se quer solucionar o suposto "problema misterioso" da scanf() que algumas vezes não lê o que tenta digitar, pode só colocar um espaço no começo da string de formatação. A scanf() vai ler e ignorar os caracteres de espaço em branco, então qualquer \n que sobrar de outra leitura vai ser ignorado.

scanf(" %d", &entrada);

 

2 horas atrás, voicewp disse:
    printf("Digite o numero de acordo com a opcao para imprimir:\n\n");
    printf("1- Elementos\n");
    printf("2- Nomes dos alunos\n");
    printf("3- Nome dos alunos e suas notas finais\n");
    printf("4- Buscar os dados de um aluno\n");
    printf("5- Alunos ordenados de acordo com a matricula\n");
    printf("6- Editar as notas do aluno (necessario busca)\n");
    printf("7- Matricula, nome e maior nota da turma\n");
    printf("8- Matricula, nome e menor nota da turma\n");
    printf("9- Alunos aprovados, reprovados e media geral da turma\n");
    printf("0- Sair do programa\n\n");

Não precisa chamar printf() 11 vezes. A função concatena strings subsequentes:

printf("string 1\n"
       "string 2\n");

 

2 horas atrás, voicewp disse:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>

Antes de incluir uma biblioteca, tenha a certeza de que vai usar seus recursos.

Não achei nada dessas 3 últimas no seu código.

  • Curtir 2
Postado

"Alocação de memória impedindo de ler o arquivo"

 

Não é isso que acontece e não sei como concluiu isso. O problema foi marcado como resolvido, mas se é um problema para valer alguma nota ainda tem um longo caminho a percorrer.

  • Curtir 2

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!