Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema al leer de un archivo y compararlo con una cadena

Estas en el tema de problema al leer de un archivo y compararlo con una cadena en el foro de C/C++ en Foros del Web. Hola antes que nada les dire el enunciado de la tarea para no cometer errores al explicar de que se tiene que hacer Inicialmente su ...
  #1 (permalink)  
Antiguo 28/05/2015, 20:54
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
problema al leer de un archivo y compararlo con una cadena

Hola antes que nada les dire el enunciado de la tarea para no cometer errores al explicar de que se tiene que hacer

Inicialmente su código debe leer un archivo llamado “reglas.txt”, este contiene en cada
línea alguna letra del abecedario (solo trabajaremos con letras mayúsculas) y al lado
de cada letra estará su respectiva codificación en binario. Serán las letras de la A
hasta la Z y los números de 0 al 4, así tenemos 32 caracteres, 5 bits para cada uno. El
archivo tiene la siguiente estructura:

<Letra> <Binario de 5 bits>Ejemplo reglas.txt:
G 00000
Z 11001
K 00011
.
.
.
.
1 01110
Fíjese que las letras en el archivo no necesariamente están en orden alfabético,
igualmente los números tampoco están en orden. La idea es que las cadenas de
entrada tengan un significado diferente según el archivo de reglas. Todas las letras y
números mencionados anteriormente deben estar incluidos en las reglas con su
respectiva codificación en binario.

Si la entrada fuera 1 00000110010111000000, se tiene que escribir el mensaje
decodificado en un archivo de salida, cada entrada es una línea en la salida. Para el
ejemplo anterior, en el archivo salida se escribe GZ1G. Todo esto con las reglas
definidas antes.


se que el codigo dice que se tiene que imprimir en un archivo salida, pero primero estoy probando que me imprima por la terminal para ir probando y asegurarme primero de que este funcionando correctamente.

Bueno. ya tengo el codigo hecho pero el codigo presenta errores, yo tengo un modelo d eprueba del archivo reglas que esta asi:

K 00101
J 10111
A 00100
X 10010
E 01100
P 11100

por lo menos si en la consola coloco opcion 1 y 00101 me imprime K que es correcto pero si coloco ejemplo 10010 que es X no me imprime nada no hace nada, y si coloco ambas lineas juntas 0010110010 (que es como se coloca en realidad) me imprime nada mas la K por eso no se que esta pasando


Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>  
  3. #include <string.h>
  4.  
  5. int main (int argc, char *argv[]) {
  6.     int i=0,j=0,k=0,l=0,m=0,n=0;
  7.     char bin[50],str1[5],letra,op,ArrSol[10];
  8.  
  9.     int caracter,ret;
  10.     int v=0, z=5;
  11.     char array[5];
  12.     FILE *reglas;
  13.  
  14.     scanf("%c %s",&op,bin);
  15.  
  16.        
  17. if(op=='1'){ //Opción 1
  18.     reglas=fopen(argv[1],"r"); //abriendo archivo reglas
  19.        
  20.      if(reglas==NULL){
  21.      printf("Error en el archivo");
  22.      }else{
  23.         while (!feof(reglas)){
  24.             if((fscanf(reglas,"%c %s",&letra,str1))!=NULL){
  25.                         //printf("%c %s\n",letra,str1);//Probando que lee línea a línea                
  26.                 for (v=0;v<z;v++){
  27.                  array[v]=bin[v];
  28.                  l++;
  29.                 }  
  30.              v=l;
  31.              z=z+5;
  32.                
  33.                 ret=strncmp(array,str1,5);
  34.                 while ((ret!=0) && (!feof(reglas))){
  35.                     fscanf( reglas, "%c %s", &letra, str1);
  36.                 }
  37.            
  38.                 if (ret==0){    
  39.                 /*char word= letra;
  40.                  printf("%c", word);*/
  41.                  
  42.                  ArrSol[k]=letra;
  43.                  k++;
  44.                 printf ("%s" , ArrSol);
  45.                     }
  46.             }
  47.         }  
  48. }
  49. fclose(reglas);
  50.  
  51. return 0;
  52. }

aqui les explico como funciona mi codigo para que no haya alguna duda:

como leo por consola una cadena de maximo 50 digitos uso un arreglo array para ir cortando esa cadena cada 5 valores (despues los iteradores v y z van a ir cambiando ahora desde ejemplo de 5 hasta 9 y asi sucesivamente para ir picando la cadena cada 5 digitos) y ese arreglo ahora lo comparo con el str1 que lee mi fscanf y uso la funcion strncmp, si son iguales devuelve 0 y quiere decir que el arrego es igual a una cadena por lo tanto guardo en arreglo soluicon la letra.

y esa letra es la codificacion que la cadena que equivale mi arreglo de 5 digitos segun el archivo reglas.

uso un segundo while ya que el tiene que seguir leyendo linea tras linea y seguir viendo cuando ese arreglo es igual alguna de las cadenas que sale en el archivo reglas.

si pueden ayudarme con esto se los agradeceria muchisimo.
  #2 (permalink)  
Antiguo 29/05/2015, 00:43
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: problema al leer de un archivo y compararlo con una cadena

Tienes varios problemas. Uno de ellos ya te lo he comentado en un hilo anterior:

Cito:
Cita:
Iniciado por eferion Ver Mensaje
Por cierto, qué sucede si en tu archivo de reglas tienes los caracteres en el orden A B y la cadena de entrada resulta ser "BA"?? te adelanto una pista, no va a descrifrar el mensaje completo.

Yo en tu lugar lo primero que haría es leer el fichero de claves y almacenar su contenido en un array. Después, con las claves ya cargadas, procedería a iterar sobre "bin" para realizar las operaciones de cifrado-descrifrado.
¿Y por qué pasa eso? Pues simplemente porque estás recorriendo el fichero sobre la marcha: Lees una secuencia y recorres el fichero hasta localizarla... pero para el siguiente elemento de la secuencia no reinicias el puntero de lectura, por lo que la búsqueda de la nueva secuencia empieza a partir del punto en el que lo dejó la anterior. Si resulta que la nueva secuencia estaba almacenada en el fichero en una posición anterior, no vas a dar con ella en la vida.

Por cierto, también te puede servir colocar el puntero interno de lectura al inicio del fichero después de localizar cada secuencia.

Te podías molestar en leer los mensajes completamente. Si pides ayuda, no haces caso de nuestras sugerencias, y vuelves a preguntar sobre lo que ya te hemos contestado.

En cuanto a lo de leer una secuencia completa... vamos a ver, tu lees el texto a descifrar del tirón:

Código C:
Ver original
  1. scanf("%c %s",&op,bin);

Después, abres e iteras sobre el archivo de reglas:

Código C:
Ver original
  1. while (!feof(reglas)){

En cada iteración lees una línea del fichero:

Código C:
Ver original
  1. if((fscanf(reglas,"%c %s",&letra,str1))!=NULL)

Y, si ésta iteración ha ido bien, copias los primeros 5 caracteres de la entrada del usuario en la variable array

Código C:
Ver original
  1. for (v=0;v<z;v++){
  2.                  array[v]=bin[v];
  3.                  l++;
  4.                 }

y estos últimos pasos se repiten hasta que localizas la secuencia. ¿Eres capaz de localizar ahora los problemas?
  • SIEMPRE te estás copiando en array los primeros 5 caracteres de la secuencia, luego únicamente vas a ser capaz de descrifrar 1 carácter
  • El bucle principal de tu programa depende de que puedas seguir leyendo el fichero. Lo lógico es que el bucle principal iterase sobre la entrada del usuario, separando dicha cadena en secuencias de 5 caracteres para poder encontrar la correspondencia a cada una

Ah si, plantéate quitarte el miedo y empieza a usar el depurador de código. Es una herramienta imprescindible y tremendamente útil. Eso y tener a mano papel y lápiz (lo necesitas para hacer el diseño de la aplicación, algo básico para asegurar que tu programa funciona cómo esperas, así como para ir llevando cuentas que verifiquen que los pasos los está realizando correctamente).

Un saludo.

Etiquetas: arreglos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:20.