Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/08/2010, 16:21
Mosazu
 
Fecha de Ingreso: abril-2010
Mensajes: 31
Antigüedad: 14 años, 8 meses
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. }