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

Interpretar una entrada con scanf()

Estas en el tema de Interpretar una entrada con scanf() en el foro de C/C++ en Foros del Web. Buenas gente, el asunto es que como proyecto de la uni me pusieron a hacer un "simulador de memoria" en c. Ya toda la lógica ...
  #1 (permalink)  
Antiguo 09/08/2010, 16:21
 
Fecha de Ingreso: abril-2010
Mensajes: 31
Antigüedad: 14 años
Puntos: 1
Interpretar una entrada con scanf()

Buenas gente, el asunto es que como proyecto de la uni me pusieron a hacer un "simulador de memoria" en c. Ya toda la lógica del simulador la tengo hecha y todo me funciona perfecto. El problema ahora es que tengo que leer de un archivo una serie de comandos como entrada para mi programa. Algo así:

$% SIMULADOR // esta etiqueta solo indicará el nombre de nuestro
simulador
$sys nombre-de-test // sys indicará un texto para el nombre de la
prueba
$mem #bytes // el comando mem es para indicar la memoria total del
sistema
$sleep #segundos // para indicar una pausa en el sistema de #segundos
$so #bytes // será un request especial del SO para reservar memoria
$pr P #bytes // PR o process request será para que un proceso "P"
solicite #bytes
$pe Q // PE o process end, para indicar la terminación de un proceso,
// por lo que se debe liberar su memoria asociada en 1 o más
bloques
$pp // PP o process print, para brindar la lista de procesos en el
sistema
// y la memoria asociada a cada uno
$frag // frag desplegará la lista de bloques libres en la memoria y
su tamaño
$dump // dump mostrará el contenido de la memoria, es decir los
caracteres
// almacenados en cada bloque según los procesos asociados

Lo único que tengo que hacer es ir leyendo cada linea, interpretar el comando que venga ahí, y llamar al metodo respectivo, pero por alguna razón no me sale bien.

Lo que hago es esto:

En el main() recibo el archivo del que voy a leer y lo asigno al stdin, y luego llamo a la funcion leer, donde basicamente lo que hago es interpretar con scanf() el comando y llamar al metodo correspondiente a lo que se deba hacer. Pero siempre me da problemas, a veces se me queda enciclado, o a veces simplemente scanf() no detecta el comando, y me tira el mensaje de error que pongo cuando leo un comando invalido, a pesar que el comando esté bien escrito.


Código C:
Ver original
  1. main(int argc, char **argv)
  2. {
  3.     if(argc <=1)
  4.     {
  5.         printf("Error 001: No se ha especificado el archivo de configuracion.\n");
  6.     }else if(argc >2)
  7.     {
  8.         printf("Error 002: Se han especificado demasiados parametros.\n");
  9.     }else{
  10.         stdin = fopen(argv[1], "r");
  11.         if(stdin == NULL)
  12.         {
  13.             printf("Error 003: el archivo %s no existe\n", argv[1]);
  14.         }else{
  15.             leer();
  16.             fclose(stdin);
  17.         }
  18.     }
  19. }

Código C:
Ver original
  1. int leer()
  2. {
  3.     char entrada[30];
  4.     int valor;
  5.     int esCorrecto = 0;
  6.     while(!feof(stdin)){
  7.         esCorrecto = scanf("$%% %s", entrada);
  8.         if(esCorrecto){
  9.         printf("Inciando el simulador: %s\n", entrada);
  10.         }else{
  11.         esCorrecto = scanf("$sys %s", entrada);
  12.         if(esCorrecto){
  13.             printf("Prueba %s iniciada\n", entrada);
  14.         }else{
  15.             esCorrecto = scanf("$mem %d", &valor);
  16.             if(esCorrecto){
  17.                 memoria = (char*)malloc(valor);
  18.             }else{
  19.                     esCorrecto = scanf("$so %d", &valor);
  20.                 if(esCorrecto){
  21.                 nuevoProceso(valor,"so");
  22.                 printf("memoria asignada al so\n");
  23.                 }else{
  24.                 esCorrecto = scanf("$pr %s %d", entrada, &valor);
  25.                 if(esCorrecto){
  26.                     nuevoProceso(valor, entrada);
  27.                     printf("memoria asignada al proceso %s\n", entrada);
  28.                 }else{
  29.                     esCorrecto = scanf("$pe %s", entrada);
  30.                     if(esCorrecto){
  31.                     liberarProc(entrada);
  32.                     printf("Proceso %s terminado\n", entrada);
  33.                     }else{
  34.                     esCorrecto = scanf("$pp");
  35.                     if(esCorrecto){
  36.                         mostrarListaProc();
  37.                     }else{
  38.                         esCorrecto = scanf("$frag");
  39.                         if(esCorrecto){
  40.                         memLibre();
  41.                         }else{
  42.                         esCorrecto = scanf("$dump");
  43.                         if(esCorrecto){
  44.                             printf("%s", memoria);
  45.                         }else{
  46.                             scanf("%s", entrada);
  47.                             printf("El comando %s no existe", entrada);
  48.                         }
  49.                         }
  50.                     }
  51.                     }
  52.                 }
  53.                 }
  54.             }
  55.         }
  56.         }
  57.     }
  58. }
  #2 (permalink)  
Antiguo 09/08/2010, 20:02
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Interpretar una entrada con scanf()

Una de los primeros errores que veo es que al scanf no se le ponen otros caracteres sino los indicadores de tipo de lectoria. Para ser mas explicito:

esCorrecto = scanf("$%% %s", entrada);
esCorrecto = scanf("%s", entrada);

Lo otro no va....

Yo por cada linea haria :
scanf("%s", comando);

Luego comparas con strcmp con cada operacion. Cuando te da 00 que son iguales lees otro scanf buscando los argumentos!!
  #3 (permalink)  
Antiguo 09/08/2010, 21:41
 
Fecha de Ingreso: abril-2010
Mensajes: 31
Antigüedad: 14 años
Puntos: 1
Respuesta: Interpretar una entrada con scanf()

Realmente si puedes poner otros caracteres al scanf();

Al decir scanf("un texto %s", variable);

lo que haces es indicarle que lea lo siguiente que existe después de leer los caracteres que indicaste.

O en este caso:
scanf("$%% %s", entrada);

que lea lo siguiente después de $%. O al menos eso me dijo el profesor . Pero podría intentarlo como dices, talvez sea mejor.
  #4 (permalink)  
Antiguo 10/08/2010, 01:31
 
Fecha de Ingreso: julio-2010
Mensajes: 153
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Interpretar una entrada con scanf()

si se puede hacer eso, pero scanf es muy estricto, por ejemplo:
scanf("$%% %s", entrada);

para que %s quede en entrada tienes que poner esto en el teclado
"$% entrada"
  #5 (permalink)  
Antiguo 11/08/2010, 04:37
 
Fecha de Ingreso: abril-2010
Mensajes: 31
Antigüedad: 14 años
Puntos: 1
Respuesta: Interpretar una entrada con scanf()

Si, exacto, segun la descripcion que me dieron, así es como vendrá en el teclado. Pero qué mas da, ya lo hice como dijo sam90 y me funko, gracias por la ayuda.
  #6 (permalink)  
Antiguo 11/08/2010, 12:08
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Interpretar una entrada con scanf()

Tecnicamente es posible ponerle caracteres, pero mi experiencia me llevo a negarlo, y recomendarlo.

Etiquetas: entrada
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 12:38.