Linguagem: C.
Algum tempo atrás, para treinar o uso de ponteiros e manipulação de arquivos em C, resolvi escrever uma pequena função para ler arquivos de configuração no estilo “opção: valor”. O resultado está aí:
char *readConf(char *option, char delim, char coment, FILE *arquivo){
char *value; /* Valor da option. */
char *aux, line[128];
int size;
while (fgets(line,128,arquivo) != NULL){
if (ferror(arquivo)){
perror("\n**ERRO ao ler arquivo em readConf.** ");
exit(1);
}
line[strlen(line)-1]= '';
if (feof(arquivo)) break;
if (*line == coment) continue;
if (strstr(StrLwr(line),StrLwr(option))){
aux= strchr(line,delim);
aux++;
while( *aux==' ' || *aux=='\t' )
aux++;
for (size=0; *aux; ++size,aux++);
value= (char *)calloc(size+1,sizeof(char));
aux-= size;
memcpy(value,aux,size);
*(value+size+1)= '';
return (value);
}
}
return (NULL);
}
Cabeçalhos necessários:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
Protótipo:
char *readConf(char *option, char delim, char coment, FILE *arquivo);
Vamos entender os parâmetros que devem ser passados:
char *option: A opção cujo valor deve ser retornado.
char delim: O delimitador que será usado entre a opção e o seu valor, por exemplo, ‘:’, ‘=’, etc.
char coment: Caracter usado para determinar se uma linha é um comentário. Geralmente é um jogo da velha: ‘#’.
FILE *arquivo: O arquivo que contém as configurações.
Dependências:
Como não existe a função strlwr() no mundo ANSII C, resolvi escreve-la também:
char *StrLwr(const char *str){
register int count;
char *str_lwr;
for(count=0;str[count];count++);
str_lwr= (char *)malloc(sizeof(char)*(count+1));
while(*str){
*str_lwr= tolower(*str);
str_lwr++;
str++;
}
*str_lwr= '';
return (str_lwr-count);
}