pedromcosta Posted May 25, 2012 at 01:28 PM Report #458080 Posted May 25, 2012 at 01:28 PM (edited) Boa tarde, Estou a tentar ler do buffer o conteúdo em baixo e a tentar guardar os campos num array campo por campo para depois ser possível inserir no mysql. São 30 campos sendo que depois da última virgula ainda é um campo mas é vazio. 2012/05/22 09:31:55,00:00:06,51,200,O,289411172,289411172,,0,1016441,0,E200,Sergio Teixeira,T9001,Line 1.1,0,0,,,Sergio Teixeira,0000.00,,0000.00,0,0,618,1.00,U,Sergio Teixeira, Para isso criei o array com 30 posições e vou escrevendo para lá o conteúdo do buffer. Quando for uma vírgula muda para a próxima linha no array para escrever outro campo mas apesar de não dar nenhum erro a compilar nem a correr, quando faço o print dá o erro "segmentation fault". Terá alguma coisa a ver com a maneira como declaro o array dos dados ou o buffer? O código é este: char buffer[1024]; char *dados[30]; int k, tamanhoBuffer; for (k = 0; k < tamanhoBuffer; k++) { printf("%c", buffer[k]); //imprime o conteúdo do buffer if (buffer[k]==','){ field_count++; }else{ dados[field_count] += buffer[k]; } } Cumprimentos, Pedro Costa Edited May 25, 2012 at 01:34 PM by pmg GeSHi adicionado
pmg Posted May 25, 2012 at 01:40 PM Report #458082 Posted May 25, 2012 at 01:40 PM No teu código, cada dados[XX] é um ponteiro (para caracteres). Alocaste memória para esses ponteiros? Senão, puseste-os a apontar para algum lado válido? E ainda, a linha abaixo não faz o que eu soponho que tu queres que faça. dados[field_count] += buffer[k]; O que acontece nesta linha, é que dados[field_count] passa a apontar para a string buffer[k] strings à frente. 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!
pedromcosta Posted May 25, 2012 at 02:48 PM Author Report #458111 Posted May 25, 2012 at 02:48 PM Exacto, estava definido como apontador mas foi para seguir um exemplo que tinha visto pela net. Tenho-me apoiado assim nos exemplos porque de c percebo o básico e tenho encalhado assim nestas partes. Mas pmg tirando então o apontador passa a ser um array normal com 30 linhas deste género: dados[0] = "linha 1"; dados[1] = "linha 2"; etc, etc certo? Porque depois na segunda parte do código que tu falas quero fazer o que estás a supor mas não vejo maneira para 😕 O objectivo era no fim de tudo imprimido ter uma coisa deste género: dados[0] = "2012/05/22 09:31:55"; dados[1] = "00:00:06"; dados[2] = "51"; Mas já percebi que o += em C não funciona, mas então como é que atribuo o valor do buffer ao array? Porque ele vai lendo caracter por caracter e assim adicionava ao array
pmg Posted May 25, 2012 at 03:19 PM Report #458126 Posted May 25, 2012 at 03:19 PM Experimenta com arrays propriamente ditos (em vez de ponteiros). Assumindo que cada dado não pode ter mais de 99 caracteres, podes fazer assim char dados[30][100] = {0}; que vai criar um array de 30 arrays, em que cada um dos sub-array pode levar até 99 caracteres mais o '\0' (para um total de 100). Para copiar uma string para um dos dados, usa strcpy() strcpy(dados[0], "2012/05/22 09:31:55"); Para adicionar um caracter a determinado dado, tens que substituir o '\0' final do dado pelo caracter pretendido e meter o '\0' na posição seguinte last = strlen(dado[0]); dado[0][last] = buffer[k]; dado[0][last + 1] = '\0'; 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!
pedromcosta Posted May 25, 2012 at 05:39 PM Author Report #458151 Posted May 25, 2012 at 05:39 PM Exacto pmg, era mesmo isso, usei a segunda forma e ficou a dar como queria! Tive só de esvaziar o array a cada leitura no socket porque senão adicionava ao conteúdo anterior mas de resto, impéc!! Obrigadíssimo outra vez pela ajuda 😉 Cumprimentos, Pedro Costa
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