Jump to content
Sign in to follow this  
Palmeira

Cópia De Ficheiro para Array Falha [Dúvida]

Recommended Posts

Palmeira

Boas, estava a fazer umas funções para um projecto de C para a universidade, e precisei de uma em particular que carrega dados de ficheiro, para array de struct.

Lembro-me que o programa funcionava ás 1000 maravilhas, mas descobri um bugzito...

Se por exemplo, iniciar o programa com ficheiros de texto limpos (sem registos) ele funciona mto bem, guarda pa ficheiro, carrega do ficheiro para a memória, enfim, um espectáculo. Mas quando eu adiciono novos registos a este ficheiro, e depois o carrego novamente, esse procedimento(ou função) já não funca mais. :|

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

void guardar();
void ler();
void html();
void guardarBinario();
void lerBinario();

typedef struct {
        int codigo;
        char nome[30];
        float altura;
        float peso;
        float imc;
} Atl;
     
Atl Atleta[30];

int atletas=0, total=0;

int main () {
    char op;
    
    do {
        system("cls");
        printf("                                     **  %d atletas em registo  **\n\n\n",atletas);
        printf("1 - Inserir Atleta\n");
        printf("2 - Consultar Atleta\n");
        printf("3 - Listar Atletas\n");
        printf("4 - Listar Atletas com IMC acima da media\n");
        printf("5 - Remover Atleta\n");
        printf("6 - Guardar Atletas em Ficheiro\n");
	    printf("7 - Ler Registos do ficheiro\n");
	    printf("8 - Guardar dados em ficheiro HTML\n");
	    printf("9 - Guardar dados em ficheiro binario\n");
	    printf("b - Ler Registos de Ficheiro Binario\n");
        printf("0 - Sair\n");
       
        op = getchar();
       
        switch(op) {
                  case '1' : {
                        inserir();
                        }
                        break;
                  
                  case '2' : { 
                       consultar();
                       }
                       break;
                  case '3' : {
                       listar_todos();
                       }
                       break;
                       
                  case '4' : {
                       listar_acima_media();
                       }
                       break;
                  case '5' : {
                       remover();
                       }
                       break;
                  case '6' : {
                       guardar();
                       }
                       break;
			  case '7' : {
                       ler();
                       }
                       break;
                  case '8' : {
                       html();
                       }
                       break;
                  case '9' : {
                       guardarBinario();
                       }
                       break;
                  case 'b' : {
                       lerBinario();
                       }
                       break;
        }
       
    } while(op != '0');   
}

int remover () {
    int cod,i;
    
    system ("cls");
    printf("                                     **  %d atletas em registo  **\n\n\n",atletas);
    printf("Codigo: ");
    scanf ("%d", &cod);
    
    for (i = 0; i < atletas; i++) {
        if (cod == Atleta[i].codigo) {
           Atleta[i].codigo = Atleta[atletas-1].codigo; 
           Atleta[i].altura = Atleta[atletas-1].altura;
           Atleta[i].peso = Atleta[atletas-1].peso;
           Atleta[i].imc = Atleta[atletas-1].imc;
           strcpy(Atleta[i].nome,Atleta[atletas-1].nome);
           atletas--;          
        }  
    }   
    
    printf("\n\n\n *** Atleta removido com sucesso ***");
    
    fflush(stdin);
    getchar();

    return 1;
}

int listar_acima_media() {
    int i;
    float soma=0, media;
    
    system("cls");
    
    for (i = 0; i < atletas; i++) {
        
        soma += Atleta[i].imc;
        }
        
    media = soma / atletas;
    
    for (i = 0; i < atletas; i++) {
        
        if (Atleta[i].imc > media) {
           printf("----------------------------------------------------\n");
           printf("Nome: ");
           puts(Atleta[i].nome);
           printf("\nCodigo: %d   Altura: %.2f   Peso: %.2f   IMC: %.2f\n", Atleta[i].codigo, Atleta[i].altura, Atleta[i].peso, Atleta[i].imc);                     
        }
    }
    printf("----------------------------------------------------\n");
    printf("\n\n\n *** Listagem realizada com sucesso ***");
    
    fflush(stdin);
    getchar();
    return 1;
}

int listar_todos() {
    int i;
    
    system("cls");
    
    for (i = 0; i < atletas;i++){
        printf("----------------------------------------------------\n");
        printf("Nome: ");
        puts(Atleta[i].nome);
        printf("\nCodigo: %d   Altura: %.2f   Peso: %.2f   IMC: %.2f\n", Atleta[i].codigo, Atleta[i].altura, Atleta[i].peso, Atleta[i].imc);
    } 
    printf("----------------------------------------------------\n");
    printf("\n\n\n *** Listagem realizada com sucesso ***");
    
    fflush(stdin);
    getchar();
    return 1;        
}

int consultar() {
    int i,cod;
    
    system("cls");
    printf("                                     **  %d atletas em registo  **\n\n\n",atletas);
    printf("Codigo: ");
    scanf("%d", &cod);
    if (cod > atletas) {
       printf("\n\n\n\n *** Codigo Invalido ***");
       fflush(stdin);
       getchar();  
       return 0;      
    } else {
      for (i = 0 ; i < atletas; i++) {
          if (Atleta[i].codigo == cod) {
             printf("Nome: ");
             puts(Atleta[i].nome);
             printf("\nAltura: %.2f\nPeso: %.2f\nIMC: %.2f", Atleta[i].altura, Atleta[i].peso, Atleta[i].imc);                       
          }
      }
    }
    
    printf("\n\n\n\n *** Leitura realizada com sucesso ***");
    fflush(stdin);
    getchar();
    return 1;       
}

int inserir() {
    
    system("cls");
    printf("                                     **  %d atletas em registo  **\n\n\n",atletas);
    printf("Codigo: ");
    scanf("%d", &Atleta[atletas].codigo);
    fflush(stdin);
    printf("\nNome: ");
    fgets(Atleta[atletas].nome, 30, stdin);
    printf("\nAltura(em metros): ");
    scanf("%f", &Atleta[atletas].altura);
    printf("\nPeso: ");
    scanf("%f", &Atleta[atletas].peso);
    Atleta[atletas].imc = Atleta[atletas].peso / (Atleta[atletas].altura * Atleta[atletas].altura);
    
    printf("\n\n\n\n *** Atleta inserido com sucesso ***");
    
    fflush(stdin);
    getchar();
    atletas++;    
        
    return 1;
}

void guardar() {
int i;
FILE * fp;
fp = fopen("dados.txt","w");

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

fprintf(fp, "%d; %f; %f; %f; %s", Atleta[i].codigo, Atleta[i].altura, Atleta[i].peso, Atleta[i].imc, Atleta[i].nome);
}
printf("atletas inseridos em ficheiro! ");
fclose (fp);
}

void ler() {
atletas = 0;
FILE * fp;
fp = fopen("dados.txt", "r");
while (! feof(fp)) {
	fscanf(fp, "%d; %f; %f; %f; %s\n", &Atleta[atletas].codigo, &Atleta[atletas].altura, &Atleta[atletas].peso, &Atleta[atletas].imc, Atleta[atletas].nome);
	atletas++;
}
printf("Dados carregados do ficheiro");
fclose(fp);
}

void html() {
     
     FILE * fp;
     int i;
     fp = fopen("dados.html","w");
     fprintf(fp, "<html><head><style>body {margin:0 auto; text-align:center;} table {width : 60%; height : 50%;font-family : Verdana, Arial, sans-serif;font-size: 11px;}tr {border: 1px solid; padding-left : 10px;padding-right : 10px;}th {border: 1px solid;text-align : center;padding-left : 10px;padding-right : 10px;}td {border: 1px solid;padding-left : 10px;padding-right : 10px;text-align : center;}table{border: 1px solid ;border-collapse:collapse;text-align : center;} </style><body><table><tr><th>Código:</th><th>Nome:</th><th>Altura:</th><th>Peso:</th><th>IMC:</th></tr>");
     for (i=0; i<atletas; i++) {
 fprintf(fp, "<tr> <td>%d</td> <td>%s</td> <td>%.2f</td> <td>%.2f</td> <td>%.2f</td></tr>  \n", Atleta[i].codigo, Atleta[i].nome, Atleta[i].altura, Atleta[i].peso, Atleta[i].imc);
     }
 fprintf(fp, "</table></body></html>");
 fclose (fp);
     printf("atletas inseridos em ficheiro! ");
 getchar();

}

void guardarBinario() {
int i;
FILE * fp;
fp = fopen("dadosBinario.dat", "wb");

for (i = 0; i<atletas; i++) {
    fwrite(&(Atleta[i]), 1, sizeof(Atl), fp);
}
fclose(fp);
printf ("Dados Escritos com Sucesso em ficheiro binario !!!!!");
getchar();
}

void lerBinario() {
FILE * fp;
fp = fopen ( "dadosBinario.dat" , "rb" );
atletas = 0;
while(!feof(fp)) {
fread(&(Atleta[atletas]), 1, sizeof(Atl), fp);
atletas++;
}
fclose (fp);
printf ("Dados Escritos com Sucesso em ficheiro binario !!!!!");
getchar();
}

Alguém sabe o que pode estar na origem disto ??

PS : Normalmente uso notepad++ e DEV-C++ para programar em C

Share this post


Link to post
Share on other sites
bubulindo

Podias completar o conjunto de definições de funções no início do ficheiro. Fica sempre bem e acho até estranho não teres tido um erro por não teres definido a função antes da main(). Mas adiante...

Já abriste o ficheiro onde adicionaste os dados para ver o que lá tens?

Assim de repente ao ver isto:

fwrite(&(Atleta), 1, sizeof(Atl), fp);

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

ptr

Pointer to the array of elements to be written.

size

Size in bytes of each element to be written.

count

Number of elements, each one with a size of size bytes.

stream

Pointer to a FILE object that specifies an output stream.

Não tens argumentos trocados?

Segundo o que escreveste, vais escrever um byte da posição i da struct Atleta, Atleta vezes. Ou não? Posso estar enganado...

Mas, e agora é curiosidade minha, sai alguma coisa para o ficheiro? Podias mostrar aqui ao povo? :$

Ahh e também devias ver o que as funções retornam... na fwrite, embora não muito provável, podes facilmente ver se saiu tudo para o ficheiro.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Palmeira

tnks ;) sim, o programa escreve tanto para ficheiro de texto como para binário,

conteudo do ficheiro .txt :

21; 1.200000; 10.000000; 6.944444; jk776; 1.000000; 10.000000; 10.000000; hgfg

1; 1.500000; 30.000000; 13.333333; jhv

1; 1.666000; 66.000000; 23.779018; iugi

- Cod, altura, peso, IMC, nome_atleta.

o código que comentaste é da função escrever_binario, que funciona perfeitamente, agora o problema é mesmo no ficheiro .txt, mas mesmo assim, tive a conversar com um colega de grupo e ele disse-me que devia ser problema da formatação da string que vai ser escrita no ficheiro..

cumps e obrigado :)

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
Sign in to follow this  

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