• Jueves 2 de Mayo de 2024, 02:11

Autor Tema:  Tratamiento De Cadenas: Help  (Leído 1808 veces)

Jevi

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
    • http://jevi.ods.org
Tratamiento De Cadenas: Help
« en: Martes 1 de Junio de 2004, 16:22 »
0
Hola, hace bastante poco que programo en C, y parece que los vícios de otros lenguajes que uso me estan haciendo más difícil el aprendizaje, así que necesito un poco de ayuda:

Estoy haciendo un programilla que lee una configuración de unos ficheros y rellena una matriz multidimensional de 200x200 con símbolos. Básicamente en un fichero hay un código de identificación y una posición X,Y para la matriz, y en el otro fichero hay la simbología de cada código.

Al leer el código en el 1er fichero leo del otro fichero el símbolo que tiene ese código y entonces ubico el símbolo en la posición X,Y. Al final me tiene que quedar una matriz pintada con símbolos.

El problema lo tengo cuando quiero saber que código he leído. En pseudocódigo sería así:

Leer línea fichero       (ejemplo formato del fichero 1=COD1;12,23)
Si cod_identif = "COD1"
  wsimbolo = 'X'
  matriz[12][23] = wsimbolo
Si cod_identif = "COD2"
  wsimbolo = 'Z'
... etc.

evidentemente esto lo haría con un case :-) Pero lo que no sé es como hacer un substring de las primeras 4 posiciones de cada línea del fichero, para poder compararlo en el if.

Gracias por cualquier ayudita. Un cordial saludo.  :hola:
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Tratamiento De Cadenas: Help
« Respuesta #1 en: Martes 1 de Junio de 2004, 16:44 »
0
Hola!!!!!!

Si vos tenes algo asi como 20 codigos distintos tu idea estaria bien. Podrias usar el strstr(cadena original, cadena a comparar) q dice si la cadena a comparar esta dentro de la original. Ahora, si tenes infinitos codigos, no se si seria una buena idea el uso de un switch() (el case como en Pascal no existe, aca se llama Switch y es algo asi:


Código: Text
  1.  
  2. switch(opcion)
  3. {
  4.   case 'a': algo();           break;
  5.   case 'b': algodistinto(); break;
  6.   default: otracosa();      break;
  7. };
  8.  
  9.  

Espero q haya servido

Salu2!!!!!!

Jevi

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
    • http://jevi.ods.org
Re: Tratamiento De Cadenas: Help
« Respuesta #2 en: Martes 1 de Junio de 2004, 17:39 »
0
Gracias nicokiki por la rapidísima respuesta :D

He utilizado el strstr y me funciona, pero aun se me plantea otra duda.

Mi registro de entrada es:  
                                        COD1{12,23;25,35;45,75;12,11,45,15}
                                        COD2{45,88;45,36;44,10}

Estas son las posiciones X,Y en la matriz para los COD1 y COD2 que tendrá el simbolo # y & respectivamente. Como ves pueden tener longitud variable.

Con tu ayuda y el strstr ya soy capaz de detectar que línea he leído, pero ahora tengo que leer las coordenadas.

En principio he pensado en montar un bucle, para patearme la línia, caracter a caracter y así leer cada coordenada. Sería algo así:

Código: Text
  1.  
  2. Para el COD1
  3. for (i=0;i<50;i++){
  4.    si caracter leído [i] es 0,1,2,3,4,5,6,7,8 ó 9
  5.        leer hasta la siguiente , y almacenar número en variable wpos_x
  6.        leer hasta la siguiente&#59; y almacenar número en variable wpos_y
  7.        matriz[wpos_x][wpos_y] = #
  8. }
  9.  

¿qué te parece? ¿hay alguna manera mejor? Gracias  :hola:
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Tratamiento De Cadenas: Help
« Respuesta #3 en: Martes 1 de Junio de 2004, 17:58 »
0
Hola!!!!!!!!

Yo creo q con eso deberias estar bien, pero te recomiendo esto:
Como vos trabajas con registros de longitud variable, al comienzo de cada registro podrias reservar 2 bytes (unsigned short) para guardar la longitud del registro y asi sabrias lo q tendrias q levantar en el buffer. Algo asi:

COD1| Longitud Registro |12,23;25,35;45,75;12,11,45,15|
COD2| Longitud Registro |14,31;12,26|
............

Entonces, luego de haber levantado la linea entera del archivo con un fgets() y metido en un buffer, verificas q codigo tiene la linea, y luego salteas el lugar donde esta reservado COD1 y geteas la longitud del registro asi:

memcpy(Longitud, Buffer, 2 ); // 2 = tamaño en bytes del unsigned short        
                                            //(supuestamente!!!!!!!)

Y luego cargas en un buffer auxiliar la cadena hasta la longitud de lo q obtuviste:

unsigned short Long = (unsigned short)atoi(Longitud);
memcpy(BufferAux, Buffer, Long); //Tene en cuenta q Buffer tiene toda la linea, y deberias haber salteado los primeros bytes q contienen el COD? y la longitud. Ese proceso te lo dejo a vos.
Todo esto lo hice porque vos hiciste un for de 50 corridas y sin saber lo q tenias en el registro, y si hicieras mas de lo q tenes verdaderamente podrias estar usando memoria de otra cosa o si hicieras menos, no obtendrias todos los datos. No se, es una idea q te doy, la cual no es muy facil pero si se q es optima.


Salu2!!!!!!!!

Jevi

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
    • http://jevi.ods.org
Re: Tratamiento De Cadenas: Help
« Respuesta #4 en: Miércoles 2 de Junio de 2004, 11:42 »
0
Nicokiki,

la verdad es que no he pillao mucho lo que me explicas  <_<  Mi nivel de C no me da pa tanto.

al final he hecho esto

Código: Text
  1.  
  2. char w_linia50[50];
  3. char w_linia05[5];
  4.  
  5. fgets(w_linia50, 51, arxiu_pl);
  6. strncpy(w_linia05, w_linia50, 4);
  7. w_linia05[4]='\0';
  8.  
  9. printf("La linia50 es: %s\n",w_linia50);
  10. printf("La linia05 es: %s\n",w_linia05);
  11.  
  12.  

pero el if no me devuelve nada
Código: Text
  1.  
  2. if (w_linia05=="MT10")
  3.       printf("Cadena MT10 ok\n");
  4.  
  5.  
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Tratamiento De Cadenas: Help
« Respuesta #5 en: Miércoles 2 de Junio de 2004, 15:17 »
0
Hola de nuevo!!!!!!

Código: Text
  1.  
  2. if (w_linia05=="MT10")
  3.      printf("Cadena MT10 ok\n");
  4.  
  5.  

El == no funciona para el char*. Es por eso q no entra al "if". Ahi tenes q usar el strcmp() asi:

Código: Text
  1.  
  2. if (strcmp(w_linia05, "MT10") == 0)
  3.     printf("Cadena MT10 ok\n");
  4.  
  5.  

Salu2!!!!!!!

Jevi

  • Miembro activo
  • **
  • Mensajes: 41
    • Ver Perfil
    • http://jevi.ods.org
Re: Tratamiento De Cadenas: Help
« Respuesta #6 en: Miércoles 2 de Junio de 2004, 16:22 »
0
Citar
El == no funciona para el char*. Es por eso q no entra al "if". Ahi tenes q usar el strcmp()
Leches, esto si que es nuevo para mí  :blink:

Me tendré que hacer con un buen libro o manual de C, porque veo que tengo bastantes lagunas  :rolleyes:

Nicokiki, muchas gracias por toda tu ayuda tan aclaratoria. Ahora que ya tengo estoy solucionado, me tengo que pelear con estructuras. Creo que postearé algún mensaje más por aquí  :P  porque no me acaba de funcionar.

Un cordial saludo Nicokiki.  :hola:
El software es como el sexo, es mejor cuando es gratis. (Linus Torvalds)