segunda-feira, 10 de dezembro de 2007

Leitura de arquivo de configuração


E ai galera!
Blz? Bom, desculpem pela demora de atualização, mas estou corrido mesmo no trabalho, e na faculdade também. Mas esta é a última semana de aula, e depois é só alegria! Bom, quanto as postagens, pretendo me policiar melhor, e começar o ano com uma meta de pelo menos uma postagem por semana. Digo começar o ano, porque estarei em Floripa para o natal e o ano novo, e pretendo me manter saudável o suficiente e não utilizar o computador durante essa semana hehehe.
Bom, o que irei passar hoje, é uma função que criei, onde faz uma leitura de um arquivo de configuração, e retorna para a string passada como argumento, e retorna 0 em sucesso ou 1 em erro, como padrão no Linux.

O código vem logo abaixo:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int readConf(FILE *pfile, int delim, const char *key, char *buf){

char tmp[256];
char tmp2[256];

char tmp3[256];
int i, j;

while(fgets(tmp, 256, pfile)){

if(strchr(tmp, '#')){
strcpy(tmp3, strchr(tmp, '#'));

if(strlen(tmp3) == strlen(tmp)){

continue;
}
}
memset(tmp3, 0, 256);

if(strcpy(tmp3, strstr(tmp, key))){

memset(tmp2, 0, 256);
if(strchr(tmp3, '#')){

memset(tmp, 0, 256);
strcpy(tmp, strchr(tmp3, '#'));

strncpy(tmp2, tmp3, strlen(tmp3) - strlen(tmp)+1);

memset(tmp3, 0, 256);
strcpy(tmp3, strchr(tmp2, delim));

}
else
strcpy(tmp3,strchr(tmp, delim));

memset(tmp2, 0, 256);
for(i=1, j=0; i<strlen(tmp3)-1; i++){

if(tmp3[i] == ' ') {
continue;

}
tmp2[j]=tmp3[i];
j++;

}
strcpy(buf, tmp2);

return 0;

}
}
return 1;
}



Para compilar este código, basta inclui-lo como um reader, ou fazer um .so (shared object) mas isso não é um assunto para hoje.
Esta função deve ser utilizada dessa forma:

if(readConf(file, ':', "path_arquivos", buf)){
printf("Erro no leitura do path_arquivos!")
}


onde:
readConf -> Nome da função;
file -> Arquivo aberto onde será localizada a string;
: -> Caracter delimitador de configuração (pode ser alterado com '=' por exemplo);
path_arquivos -> string a ser localizada dentro do arquivo 'file'
buf -> String onde será retornado o valor da configuração

Para o arquivo ser lido, eu optei por passar o parametro do 'file' como um arquivo aberto lá fora mesmo, na main por exemplo, onde ele deve ser de um tipo FILE *
Outra coisa, o arquivo pode ser comentado também, na minha implementação, ele aceita o valor '#' para isso, mas caso queira alterar, fique a vontade, não é nem um pouco difícil!

Obrigado a todos e até a próxima!

buscapé

dell
Saiba onde tem o melhor preço antes de comprar