PsySc0rpi0n Posted June 26, 2016 at 09:37 AM Report #597395 Posted June 26, 2016 at 09:37 AM (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 June 26, 2016 at 10:30 AM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
PsySc0rpi0n Posted June 26, 2016 at 12:09 PM Author Report #597400 Posted June 26, 2016 at 12:09 PM (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 June 26, 2016 at 12:09 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
Flinger Posted June 27, 2016 at 08:17 AM Report #597409 Posted June 27, 2016 at 08:17 AM (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 June 27, 2016 at 08:47 AM by Flinger
PsySc0rpi0n Posted June 27, 2016 at 07:03 PM Author Report #597428 Posted June 27, 2016 at 07:03 PM (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 June 27, 2016 at 07:04 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now