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

nunolevezinho

Controlar dados de um ficheiro binario

Mensagens Recomendadas

nunolevezinho    1
nunolevezinho

Boas, tenho um ficheiro binário com o seguinte conteúdo: (tem mais para baixo na janela...)

K1W0X6r.png

Para ler o ficheiro e armazenar os valores, estou a usar:

while(fread(&buffer, sizeof(int), 1, file) == 1){
 data[i]=buffer;
 i++;
 printf("Data: %d\n", buffer);
}

O Primeiro e Segundo dígitos do ficheiro são o número de Corredores de Armários (respectivamente) de um dado armazém.

Neste caso temos 5 corredores e 3 armários. Estes 2 primeiros dígitos significam sempre o mesmo de ficheiro para ficheiro.

Exemplo de um ficheiro:

/*

5Corredores

3Armários

Corredor 1

3P 2unidades 4 4unidades 7 78unidades 1

2P 55unidades 2 45unidades 12

1P 9unidades 2

Corredor 2

2Produtos 3unidades 3 12unidades 2

3Produtos 20unidades 1 21unidades 2 22unidades 1

1Produtos 30unidade 5

.....

*/

O meu problema está em aceder aos dados desse ficheiro, se o ficheiro a ser utilizador for diferente ao que nos foi fornecido, ou seja, para aceder "directamente" ao 2P do corredor 1, eu utilizo printf("%d\n", data[10]);, mas se o ficheiro aberto for diferente (e o programa tem de estar preparado para isso) o data[10] poderá ser por exemplo o numero de unidades de um determinado produto em vez do numero de produtos.

Qual é a maneira que eu tenho de controlar isso e apresentar os dados ?

Editado por nunolevezinho

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

o que apresentaste não é um ficheiro binário, é um ficheiro de texto em que o texto segue um formato específico

método do uso de matriz de tamanho estático

#define MAX_CORREDORES 5
#define MAX_ARMARIOS 3
#define MAX_PRODUTOS 4
#define BSIZE 256

FILE * fd;
int data[MAX_CORREDORES][MAX_ARMARIOS][MAX_PRODUTOS];
int n_corredores, n_armarios;
int i, j, k;
char buffer[bSIZE];
char * tok = NULL;

memset(data, 0, sizeof data);

// ... abertuda do ficheiro

// não podes usar o fread para ler os dados porque o '\n' irá te estragar os planos

fgets(buffer, BSIZE, fd);
sscanf(buffer, "%d", &n_corredores);

fgets(buffer, BSIZE, fd);
sscanf(buffer, "%d", &n_armarios);

for (i = 0; i < n_corredores; i++) {
 for (j = 0; j < n_armarios; j++) {
   fgets(buffer, BSIZE, fd);

   k = 0;
   tok = strtok (buffer," ");
   while (tok != NULL) {
     if (sscanf(tok, "%d", &data[i][j][k]) != 1) {
       printf("Erro de leitura dos dados em : %d %d %d\n", i, j, k);
     }
     tok = strtok(NULL, " ");
     k++;
   }
 }
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Em vez dum array com uma unica dimensao para tudo

faz um array de corredores ... em que cada elemento é um array de armarios ... em que cada elemento é um array de produtos.

int valor[NUM_CORREDORES][NUM_ARMARIOS][NUM_PRODUTOS];

para aceder "directamente" ao 2P do corredor 1

valor[0][2][1]; // corredor 0 (primeiro corredor); terceiro armario; segundo produto


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nunolevezinho    1
nunolevezinho

fgets(buffer, BSIZE, fd);
sscanf(buffer, "%d", &n_corredores);
//Outuput n_corredores: -858993460
fgets(buffer, BSIZE, fd);
sscanf(buffer, "%d", &n_armarios);
//Outuput n_armarios: -858993460

Eu usava o fread porque os dados estão todos juntos no ficheiro, estão tipo assim:

53324477812552451219223312232012122211305213462334644247717440148531711811913243 34437515052573583

Acaba aqui o ficheiro, nunca chega a ter espaços nem novas linhas.

Nunca chego a entrar no while (tok != NULL) porque mesmo eu metendo n_corredores = 5, o tok está vazio.

Editado por nunolevezinho

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

tens de te decidir !!

afinal o ficheiro tem

Eu usava o fread porque os dados estão todos juntos no ficheiro, estão tipo assim:

53324477812552451219223312232012122211305213462334644247717440148531711811913243 34437515052573583

ou é binário ...

mesmo que seja binário, podes adaptar a solução apresentada, basta alterar o método de leitura dos dados


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


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