nunolevezinho Posted May 15, 2013 at 11:16 PM Report #507565 Posted May 15, 2013 at 11:16 PM (edited) Boas, tenho um ficheiro binário com o seguinte conteúdo: (tem mais para baixo na janela...) 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 May 15, 2013 at 11:17 PM by nunolevezinho
HappyHippyHippo Posted May 16, 2013 at 05:26 AM Report #507577 Posted May 16, 2013 at 05:26 AM (edited) 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 May 16, 2013 at 05:27 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pmg Posted May 16, 2013 at 09:10 AM Report #507585 Posted May 16, 2013 at 09:10 AM 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!
nunolevezinho Posted May 17, 2013 at 07:47 PM Author Report #507859 Posted May 17, 2013 at 07:47 PM (edited) 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 May 17, 2013 at 07:47 PM by nunolevezinho
HappyHippyHippo Posted May 17, 2013 at 08:02 PM Report #507860 Posted May 17, 2013 at 08:02 PM não deixa de ser um ficheiro de texto ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
nunolevezinho Posted May 17, 2013 at 08:25 PM Author Report #507864 Posted May 17, 2013 at 08:25 PM O ficheiro que estou a usar está disponível em https://mega.co.nz/#!uNJFCLIa!fXrolleACXBhU5HWK0BRPX-0QVAg9iCGEXSBZxYnnZM. Se eu o abrir como o Notepad só vejo caracteres tipo quadrados, por isso é que eu digo que é binário.
HappyHippyHippo Posted May 17, 2013 at 08:36 PM Report #507865 Posted May 17, 2013 at 08:36 PM 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 Portugol Plus
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