elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con biblioteca que lee un fichero de configuracion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con biblioteca que lee un fichero de configuracion  (Leído 3,424 veces)
snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Ayuda con biblioteca que lee un fichero de configuracion
« en: 21 Agosto 2015, 20:12 pm »

Hola a tod@s, pues ahora estoy haciendo una pequeña libreria que facilita la extracción de información de archivos de configuración, estos ficheros de configuración serían del tipo:

Código:
campo1=valor1
campo2=valor2
#esto lo ignora, es solo un comentario
campo3=valor3
etc...

La función que se usaría tendría la sintaxys:

Código
  1. get_value("archivo.conf", "campo1", valor);
  2.  

Es decir, le pasamos, como primer elemento, el archivo de configuración, como segundo elemento el campo del que va a extraer la información, y como tercer parametro, un array (creado en el programa que usa la librería) donde guardará el valor extraido (con strcpy).

El código es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int get_value(char [], char [], char []);
  6. static void clear_array(char [], int);
  7.  
  8.  
  9. int get_value(char file_conf[], char subject_i[], char value_i[]) {
  10.  
  11. FILE * file;
  12.  
  13. int file_line_size=50;
  14. int subject_size=25;
  15. int value_size=25;
  16.  
  17. char buffer[file_line_size];
  18. char subject[subject_size];
  19. char value[value_size];
  20.  
  21. file=fopen(file_conf, "r");
  22. if (file==NULL) {
  23.  
  24. printf("Error al abrir el archivo\n");
  25. return 1;
  26.  
  27. }
  28.  
  29. int x, y;
  30. while (!feof(file))
  31. {
  32. clear_array(buffer, file_line_size);
  33. clear_array(subject, subject_size);
  34. clear_array(value, value_size);
  35.  
  36. fgets(buffer,file_line_size,file);
  37. if (buffer[0]=='#') continue;
  38. x=0;
  39. for (x=0; x<subject_size; x++) {
  40. if(buffer[x]=='=') break;
  41. subject[x]=buffer[x];
  42. }
  43.  
  44. for (x; x<file_line_size; x++) {
  45.  
  46. value[x]=buffer[x];
  47.  
  48. }
  49. printf("el campo es %s\n", subject);
  50. printf("el valor es %s\n", value);
  51.  
  52. if (strcmp(subject_i, subject)==0) { strcpy(value_i, value); return 0; }
  53. }
  54. printf("No existe el campo dentro del fichero\n");
  55. return 1;
  56. }
  57.  
  58. static void clear_array(char array[], int size) {
  59.  
  60. int x;
  61.  
  62. for(x=0;x<size;x++) {
  63.  
  64. array[x]='\0';
  65.  
  66.  
  67. }
  68.  
  69. }
  70.  

Los problemas que me dan son:

1) No extrae la información, ni siquiera me muestra el campo, la salida que me da es la siguiente:

el campo es
el valor es
el campo es
el valor es
el campo es
el valor es

2) El while hace un ciclo más del que debe, es decir, si el fichero de configuración tiene 3 lineas, el while da 4 vueltas... lo he comprobado con los printfs que he puesto en mitad del while.

Gracias de antemano.

Saludos.


« Última modificación: 21 Agosto 2015, 23:15 pm por snake_linux » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con biblioteca que lee un fichero de configuracion
« Respuesta #1 en: 21 Agosto 2015, 20:23 pm »

recomiendo lo siguiente...

1- siempre que se cargue la librería y se le pase un archivo, lee todo el archivo
2- todos los valores obtenidos guardalos en un array bidimensional, siendo el primer valor el nombre y el segundo el contenido
3- recomiendo siempre borrar los espacios en los bordes (trim) ya que la gente podría hacer
Código:
 #comentario con espacio por delante
variable = valor con un espacio de sobre aqui ->
para esto podría ser util isspace de la librería ctype.h

por otro lado tu error está probablemenet en la linea 46  donde value empieza a popularse desde el medio y sin discriminación


« Última modificación: 21 Agosto 2015, 20:26 pm por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: Ayuda con biblioteca que lee un fichero de configuracion
« Respuesta #2 en: 21 Agosto 2015, 20:56 pm »

recomiendo lo siguiente...

1- siempre que se cargue la librería y se le pase un archivo, lee todo el archivo
2- todos los valores obtenidos guardalos en un array bidimensional, siendo el primer valor el nombre y el segundo el contenido
3- recomiendo siempre borrar los espacios en los bordes (trim) ya que la gente podría hacer
Código:
 #comentario con espacio por delante
variable = valor con un espacio de sobre aqui ->
para esto podría ser util isspace de la librería ctype.h

por otro lado tu error está probablemenet en la linea 46  donde value empieza a popularse desde el medio y sin discriminación

No entiendo lo del error en la linea 46, ¿me lo podrías explicar un poco más detallado?
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con biblioteca que lee un fichero de configuracion
« Respuesta #3 en: 21 Agosto 2015, 21:04 pm »

copio desde la linea 39, hablaré de los numeros de linea aquí
Código
  1. for (x=0; x<subject_size; x++) {
  2. if(buffer[x]=='=') break;
  3. subject[x]=buffer[x];
  4. }
  5.  
  6. for (x; x<file_line_size; x++) {
  7.  
  8. value[x]=buffer[x];
  9.  
  10. }

supongamos que en el fichero tienes
Código:
hola=mundo
el for de la linea 1 empieza en 0 y avanza hasta conseguir '=' es decir hasta 5
así que subject quedaría en memoria
Código:
|h|o|l|a|0|0|0|0|0|....

cuando llegas a la linea 6 tienes un for que no inicia, sino que continúa

value está limpio y sería a nivel de memoria algo como
Código:
|0|0|0|0|0|0|0|0|0|....

cuando lo llenas, empiezas a llenarlo desde la posición que quedó el ciclo anterior (en nuestro caso 5), así que
Código:
|0|0|0|0|0|m|u|n|d|o|0|0....

cuando lo vas a imprimir, printf no lee cadena en en value, ya que empieza con fin de cadena (ese 0 que muestro en el string) y no imprime nada

value tienes que escribirlo desde 0, así que puedes usar x como base para buffer, pero no para value
« Última modificación: 21 Agosto 2015, 21:07 pm por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: Ayuda con biblioteca que lee un fichero de configuracion
« Respuesta #4 en: 21 Agosto 2015, 22:06 pm »

copio desde la linea 39, hablaré de los numeros de linea aquí
Código
  1. for (x=0; x<subject_size; x++) {
  2. if(buffer[x]=='=') break;
  3. subject[x]=buffer[x];
  4. }
  5.  
  6. for (x; x<file_line_size; x++) {
  7.  
  8. value[x]=buffer[x];
  9.  
  10. }

supongamos que en el fichero tienes
Código:
hola=mundo
el for de la linea 1 empieza en 0 y avanza hasta conseguir '=' es decir hasta 5
así que subject quedaría en memoria
Código:
|h|o|l|a|0|0|0|0|0|....

cuando llegas a la linea 6 tienes un for que no inicia, sino que continúa

value está limpio y sería a nivel de memoria algo como
Código:
|0|0|0|0|0|0|0|0|0|....

cuando lo llenas, empiezas a llenarlo desde la posición que quedó el ciclo anterior (en nuestro caso 5), así que
Código:
|0|0|0|0|0|m|u|n|d|o|0|0....

cuando lo vas a imprimir, printf no lee cadena en en value, ya que empieza con fin de cadena (ese 0 que muestro en el string) y no imprime nada

value tienes que escribirlo desde 0, así que puedes usar x como base para buffer, pero no para value

Gracias por la aclaración, me ha servido de mucho, he modificado un poco el código y ya obtiene tanto el campo como el valor, pero ahora tengo otro pequeño problema... ahora resulta, que solo lee una linea, es decir un campo y un valor e ignora el resto, te dejo el código que he editado:

Código
  1. y=0;
  2. for (x=x+1; x<file_line_size; x++) {
  3. if(buffer[x]=='\n') break;
  4. value[y]=buffer[x];
  5. y++;
  6.  
  7. }
  8.  

¿Por que puede ser?

Gracias de antemano.
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Ayuda con biblioteca que lee un fichero de configuracion
« Respuesta #5 en: 21 Agosto 2015, 22:36 pm »

Linea 52, tienes un return
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: Ayuda con biblioteca que lee un fichero de configuracion
« Respuesta #6 en: 21 Agosto 2015, 23:14 pm »

Linea 52, tienes un return

Perdona, no se en que estaba pensando...

Muchísimas gracias por tu ayuda, marco como solucionado.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Qué se puede hacer teniendo acceso a un fichero de configuración de un CMS?
Nivel Web
rivers3 1 2,773 Último mensaje 9 Julio 2009, 09:44 am
por WHK
Leer fichero de configuracion mediante java.util.properties « 1 2 »
Java
alzehimer_cerebral 10 14,829 Último mensaje 13 Abril 2010, 12:09 pm
por Perikles
Ayuda con fichero ?
Programación C/C++
<<<-Basura->>> 1 1,777 Último mensaje 8 Octubre 2011, 03:43 am
por rir3760
Ayuda con un programa de Biblioteca
Java
noelia.novella 2 2,129 Último mensaje 5 Junio 2012, 12:47 pm
por robertito_prado
AYUDA PARA CREAR RED EN LA BIBLIOTECA
Wireless en Windows
biblioteca 5 4,642 Último mensaje 8 Julio 2013, 16:21 pm
por ChimoC
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines