Jump to content

Recommended Posts

Posted (edited)

Boas...

Por incrível que pareça nem isto estou a conseguir fazer. Uma coisa tão simples como escrever uma estrutura de dados preenchida num ficheiro, ler de novo a estrutura do ficheiro e apresentar o conteúdo na consola...

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

#define BUFFER 15

typedef struct dadosMoeda{
   int NiM;
   char Metal[bUFFER];
   float Valor;
   int Stock;
}imoeda;

//Abrir stream para um ficheiro
FILE* fileOpen(FILE* fp, char* fileName){
   if((fp = fopen(fileName, "a+")) == NULL){
       printf("Erro ao abrir ficheiro!\n");
       exit(-1);
   }
   return fp;
}

void mostraMenu(void){
   printf("Menu Principal\n");
   printf("\tInserir Moeda\n");
   printf("\tAtualizar Stock\n");
   printf("\tSair\n");
}

int main(int argc, char** argv){
   imoeda tmpbasedados = {0}, tmpbasedadosf = {0};
   FILE* fpointer = NULL;

   fpointer = fileOpen(fpointer, "moedas.dat");
   tmpbasedados.NiM = 100;
   strcpy(tmpbasedados.Metal, "Ouro");
   tmpbasedados.Valor = 300;
   tmpbasedados.Stock = 50;
   fwrite(&tmpbasedados, sizeof(imoeda), 1, fpointer);
   fseek(fpointer, 0, SEEK_SET);
   fread(&tmpbasedadosf, sizeof(imoeda), 1, fpointer);
   MostraMoeda(tmpbasedadosf);
   fclose(fpointer);
   return 0;
}

Estava-me a esquecer do fseek... Para já parece estar resolvido!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted (edited)

Agora sim, tenho outro erro...

Criei um ficheiro e coloquei lá duas estruturas preenchidas. Já testei carregar uma a uma para um estrutura em memória e imprimir na consola... Ambas as estruturas aparecem correctamente na consola depois de carregadas do ficheiro para a memória!

Agora avancei para o próximo passo que é contar as estruturas no ficheiro, alocar memória para um vector destas estruturas, carregar as estruturas do ficheiro para esta memória e imprimir na consola! Provavelmente o problema está na forma como estou a "usar/chamar" o apontador para este vector de estruturas e não tenho a certeza como usar este apontador para o vector das estruturas!

Para além disso, estou a alocar memória para o vector de estruturas multiplicando o tamanho da estrutura pelo número de registos lidos do ficheiro e a coisa não bate certo. O tipo de dados que criei, usando o sizeof, mostra 28 bytes e quando faço o mesmo à variável a que acabei de alocar memória, supostamente devia dar 56 bytes (28 * 2) mas está a mostrar 8 bytes!

//Alocar memória para dados de moedas
imoeda* AlocaMemoria(int RegCount){
   imoeda* tmpmoeda = NULL;
   if((tmpmoeda = malloc(sizeof(imoeda) * RegCount)) == NULL){
       printf("Erro de memória!\n");
       exit(-2);
   }
   return tmpmoeda;
}

int main(int argc, char** argv){
   imoeda *tmpbasedados = NULL;
   FILE* fpointer = NULL;
   int RegFileCount = 0, i = 0;

   fpointer = fileOpen(fpointer, "moedas.dat");
   RegFileCount = ContaRegistos(fpointer);
   tmpbasedados = AlocaMemoria(RegFileCount);
   printf("imoeda size: %zu\n", sizeof(imoeda));
   printf("tmpbasedados size: %zu\n", sizeof(tmpbasedados));
   printf("tmpbasedados size 1: %zu\n", sizeof(imoeda) * RegCount);
   for(i = 0; i < RegFileCount; i++){
       fread(&tmpbasedados[i], sizeof(imoeda), 1, fpointer);
   }

O código completo está aqui:

https://ideone.com/VMuNro

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Posted (edited)
printf("imoeda size: %zu\n", sizeof(imoeda));
printf("tmpbasedados size: %zu\n", sizeof(tmpbasedados));

tmpbasedados é do tipo apontador para imoeda. Qual o tamanho de um apontador?

De resto, na linha

printf("tmpbasedados size 1: %zu\n", sizeof(imoeda) * RegCount);

Em vez de RegCount deveria ser RegFileCount, e nas funções comentadas, tmpbasedados é apontador e as funções trabalham com iMoeda, não com apontadores... de resto não vejo problemas..

Se quiseres mais uma mão, posta aí um ficheiro com dados, e descreve o problema.

Edited by Flinger
Posted (edited)

Já dei conta do problema... Obrigado! O IRC/Skype tem destas coisas!

Só não coloquei a thread como "solved" porque ainda não acabei o que queria fazer com isto! E se aparecerem mais problemas, posto aqui!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

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