Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

PsySc0rpi0n

Erros em função

Mensagens Recomendadas

PsySc0rpi0n    8
PsySc0rpi0n

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!

Editado por PsySc0rpi0n

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n    8
PsySc0rpi0n

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

Editado por PsySc0rpi0n

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger    50
Flinger

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.

Editado por Flinger

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n    8
PsySc0rpi0n

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!

Editado por PsySc0rpi0n

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.