Jump to content
nunolevezinho

Controlar dados de um ficheiro binario

Recommended Posts

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 ?

Edited by nunolevezinho

Share this post


Link to post
Share on other sites
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++;
   }
 }
}

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites
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.

Edited by nunolevezinho

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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