Ir ao conteúdo
  • Cadastre-se

C++ Gravação de informação do programa que estou criando.


Posts recomendados

Estou fazendo um programa para minha faculdade mais não saiu daqui, não sei onde errei, alguém pode me ajudar 

ele estar rodando normal, mais não grava as informação de cpf, altura e etc

 

<>

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

#define TAM 10000

typedef struct {
    char matricula[10];
    char nome[50];
    char curso[25];
    char cpf [25];
    char peso[10];
    char altura [10];
    char idade[5];
} Aluno;

void inicializaLista(Aluno *lista, int n) {
    int i;

    for (i = 0; i < n; i++) {
        strcpy(lista[i].matricula,"");
        strcpy(lista[i].nome,"");
        strcpy(lista[i].curso,"");
        strcpy(lista[i].cpf,"");
        strcpy(lista[i].peso,"");
        strcpy(lista[i].altura,"");
        strcpy(lista[i].idade,"");
    }
}

void copiaAlunosLista2Arquivo(Aluno *lista, int n, char *nomeArquivo) {
    FILE *procurador = fopen(nomeArquivo,"a"); //foi aberto para escrita
    int i;

    //fprintf(procurador, "ALUNOS MATRICULADOS\n\n");
    for (i = 0; i < n; i++) {

        if (strcmp(lista[i].matricula,"") == 0) {
            break;
        }

        fprintf(procurador, "%s ", lista[i].matricula);
        fprintf(procurador, "%s ", lista[i].nome);
        fprintf(procurador, "%s ", lista[i].curso);
        fprintf(procurador, "%s ", lista[i].cpf);
        fprintf(procurador, "%s ", lista[i].peso);
        fprintf(procurador, "%s ", lista[i].altura);
        fprintf(procurador, "%s ", lista[i].idade);

        fflush(procurador);
    }

    fclose(procurador);
}

void insereAluno(Aluno *lista, int n) {
    int i;
    FILE *procurador = fopen("salvaAlunos.txt","a");
    char matricula[10];

    printf("Matricula : ");
    scanf("%s", matricula);
    fflush(stdin);

    for (i = 0; i < n; i++) {

        if (strcmp(lista[i].matricula, matricula) == 0) {
            printf("Matricula já cadastrada. Voltando para menu\n");
            break;
        }

        if (strcmp(lista[i].matricula,"") == 0) {
            printf("Aluno sera inserido na posicao %d.\n", i);

            strcpy(lista[i].matricula, matricula);

            fflush(stdin              );
            printf("Nome: "           );
            scanf("%s",lista[i].nome  );

            fflush(stdin              );
            printf("Sigla curso: "    );
            scanf("%s", lista[i].curso);
            
            fflush(stdin              );
            printf("cpf: "    );
            scanf("%s", lista[i].curso);
            
            fflush(stdin              );
            printf("peso: "    );
            scanf("%s", lista[i].curso);
            
            fflush(stdin              );
            printf("altura: "    );
            scanf("%s", lista[i].curso);
            
            fflush(stdin              );
            printf("idade: "    );
            scanf("%s", lista[i].curso);

            fprintf(procurador, "%s " , lista[i].matricula);
            fprintf(procurador, "%s " , lista[i].nome     );
            fprintf(procurador, "%s ", lista[i].curso    );
            fprintf(procurador, "%s ", lista[i].cpf    );
            fprintf(procurador, "%s ", lista[i].peso    );
            fprintf(procurador, "%s ", lista[i].altura    );
            fprintf(procurador, "%s ", lista[i].idade    );

            break;
        }
    }
    fclose(procurador);

    if (i == n) printf("Lista cheia!\n");
}

int pega_do_arquivoTXT(Aluno *lista, int n){
    FILE *fp = fopen("salvaAlunos.txt","r");
    if(fp == NULL)return 0;
    int i=0;
    while(fscanf(fp,"%s",&lista[i].matricula)!= EOF &&
          fscanf(fp,"%s",&lista[i].nome     )!= EOF &&
          fscanf(fp,"%s",&lista[i].curso    )!= EOF &&
          fscanf(fp,"%s",&lista[i].cpf    )!= EOF &&
          fscanf(fp,"%s",&lista[i].altura    )!= EOF &&
          fscanf(fp,"%s",&lista[i].idade    )!= EOF ){
        i++;
    }
    return 1;
}

void exibeAlunos(Aluno *lista, int n) {
    int i;

    for (i = 0; i < n; i++) {
        if (strcmp(lista[i].matricula,"") == 0) {
            break;
        }
        printf("Matricula -: %s\n", lista[i].matricula);
        printf("Nome ------: %s\n", lista[i].nome     );
        printf("Curso -----: %s\n", lista[i].curso    );
        printf("cpf -----: %s\n", lista[i].curso    );
        printf("peso -----: %s\n", lista[i].curso    );
        printf("altura -----: %s\n", lista[i].curso    );
        printf("idade -----: %s\n", lista[i].curso    );
        printf("-----------------------------------\n");
    }
}


int main() {
    Aluno lista[TAM];
    int opcao,r;

    inicializaLista(lista, TAM);
    r = pega_do_arquivoTXT(lista,TAM);/* pega os dados que foram gravados anteriormente no arquivo txt*/

    do {
        printf("1 - Insere aluno\n");
        printf("2 - Lista alunos\n");
        printf("3 - Remove aluno\n");
        printf("4 - Sair\n");
        printf("Opcao: ");
        scanf("%d", &opcao);

        switch (opcao) {
            case 1 : printf("INSERCAO DE ALUNO !\n\n");
                     insereAluno(lista,TAM);
                     r=1;
                     break;
            case 2 : printf("\nEXIBICAO DE ALUNOS !\n\n");
                     if( r )exibeAlunos(lista, TAM);
                     else printf("Primeiro Insira Os Dados !");
                     printf("\n\n");
                     break;
            case 3 :
                     break;
            case 4 :
                     break;
            default : printf("Opcao invalida ! !\n");
        }

    } while (opcao != 4);


    //copiaAlunosLista2Arquivo(lista, TAM, "salvaAlunos.txt");

    return 1;
}

<>

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

23 minutos atrás, JULIANOMANAURA2020 disse:

ele estar rodando normal, mais não grava as informação de cpf, altura e etc

 

Então não está assim "normal" mesmo. 

 

Precisa mesmo testar com um vetor de 10 mil alunos?

 

Você declarou Aluno* e isso é... um ponteiro para Aluno. Um único aluno.

Ou você declara e constrói  um vetor de ponteiros para estrutura, usando Aluno**, ou declara um ponteiro para um vetor de Aluno, usando Aluno[] como argumento nas funções.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 minutos atrás, arfneto disse:

 

Então não está assim "normal" mesmo. 

 

Precisa mesmo testar com um vetor de 10 mil alunos?

 

Você declarou Aluno* e isso é... um ponteiro para Aluno. Um único aluno.

Ou você declara e constrói  um vetor de ponteiros para estrutura, usando Aluno**, ou declara um ponteiro para um vetor de Aluno, usando Aluno[] como argumento nas funções.

 buguei agora como? 

Link para o comentário
Compartilhar em outros sites

void insereAluno(Aluno *lista, int n);

 

Essa construção é problemática. Procure usar algo assim

void insereAluno(Aluno* novo, Aluno[] turma, int n);

 

e não misture a leitura com a inserção. Isso só dificulta os testes e leva a problemas. E fica mais difícil de ler.

 

Mais ainda, escreva em torno de seus dados e entenda que uma Sala por exemplo é um conjunto de alunos. Chamado container em C++ ou coleção em java, e escreva algo assim
 


typedef struct {
    char matricula[10];
    char nome[50];
    char curso[25];
    char cpf[25];
    char peso[10];
    char altura[10];
    char idade[5];
} Aluno;

typedef struct
{
    char nome[50];
    int  N; // quantos tem agora?
    Aluno aluno[TAM];
}   Turma;

 

Aí você pode declarar coisas assim
 

    Turma fisica[3];
    fisica[0].N = 0;
    strcpy(fisica[0].nome, "Fisica II Turma A");

    fisica[1].N = 0;
    strcpy(fisica[1].nome, "Fisica II Turma B");

    fisica[2].N = 0;
    strcpy(fisica[2].nome, "Fisica II Turma C");

 

E criar 3 salas de física e começar com 0 alunos em cada uma e carregar os caras. Só que cada turma tem seus dados, incluindo o vetor e o tamanho, então tudo fica mais fácil de ler e programar.

 

10 minutos atrás, JULIANOMANAURA2020 disse:

 buguei agora como? 

 

Pode ser algo simples com declarar

void insereAluno(Aluno lista[], int n);

 

Se leu o resto que escrevi entende que pode ser melhor escrever de outro jeito, passando um aluno para a função e NUNCA lendo lá dentro.

Link para o comentário
Compartilhar em outros sites

27 minutos atrás, arfneto disse:

void insereAluno(Aluno *lista, int n);

 

Essa construção é problemática. Procure usar algo assim


void insereAluno(Aluno* novo, Aluno[] turma, int n);

 

e não misture a leitura com a inserção. Isso só dificulta os testes e leva a problemas. E fica mais difícil de ler.

 

Mais ainda, escreva em torno de seus dados e entenda que uma Sala por exemplo é um conjunto de alunos. Chamado container em C++ ou coleção em java, e escreva algo assim
 



typedef struct {
    char matricula[10];
    char nome[50];
    char curso[25];
    char cpf[25];
    char peso[10];
    char altura[10];
    char idade[5];
} Aluno;

typedef struct
{
    char nome[50];
    int  N; // quantos tem agora?
    Aluno aluno[TAM];
}   Turma;

 

Aí você pode declarar coisas assim
 


    Turma fisica[3];
    fisica[0].N = 0;
    strcpy(fisica[0].nome, "Fisica II Turma A");

    fisica[1].N = 0;
    strcpy(fisica[1].nome, "Fisica II Turma B");

    fisica[2].N = 0;
    strcpy(fisica[2].nome, "Fisica II Turma C");

 

E criar 3 salas de física e começar com 0 alunos em cada uma e carregar os caras. Só que cada turma tem seus dados, incluindo o vetor e o tamanho, então tudo fica mais fácil de ler e programar.

 

 
 

 

Pode ser algo simples com declarar


void insereAluno(Aluno lista[], int n);

 

Se leu o resto que escrevi entende que pode ser melhor escrever de outro jeito, passando um aluno para a função e NUNCA lendo lá dentro.

ASSIM, VOU FAZER ISSO, OBRIGADO

Link para o comentário
Compartilhar em outros sites

Não há razão para inicializaLista(). Apenas controle o número de alunos. Está alterando 10.000 estruturas a toa.

 

Em copiaAlunosLista2Arquivo() não leia campo a campo. Para que todo o trabalho de criar a estrutura se vai ler campo a campo? Pense bem. Grave e leia uma estrutura inteira por vez usando o simples: read() e write()

 

As primeiras funções que deve escrever são as que gravam no disco e as que listam a estrutura como está na memória. Porque é assim que se certifica de que as coisas estão andando de acordo com o esperado...

 

 

Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!