Jump to content

Recommended Posts

Posted (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 by pmg
GeSHi adicionado
Posted

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!

Posted

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

Posted

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!

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.