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 originalmain(int argc, char **argv)
{
if(argc <=1)
{
printf("Error 001: No se ha especificado el archivo de configuracion.\n"); }else if(argc >2)
{
printf("Error 002: Se han especificado demasiados parametros.\n"); }else{
stdin
= fopen(argv
[1], "r"); if(stdin == NULL)
{
printf("Error 003: el archivo %s no existe\n", argv
[1]); }else{
leer();
}
}
}
Código C:
Ver originalint leer()
{
char entrada[30];
int valor;
int esCorrecto = 0;
esCorrecto
= scanf("$%% %s", entrada
); if(esCorrecto){
printf("Inciando el simulador: %s\n", entrada
); }else{
esCorrecto
= scanf("$sys %s", entrada
); if(esCorrecto){
printf("Prueba %s iniciada\n", entrada
); }else{
esCorrecto
= scanf("$mem %d", &valor
); if(esCorrecto){
memoria
= (char*)malloc(valor
); }else{
esCorrecto
= scanf("$so %d", &valor
); if(esCorrecto){
nuevoProceso(valor,"so");
printf("memoria asignada al so\n"); }else{
esCorrecto
= scanf("$pr %s %d", entrada
, &valor
); if(esCorrecto){
nuevoProceso(valor, entrada);
printf("memoria asignada al proceso %s\n", entrada
); }else{
esCorrecto
= scanf("$pe %s", entrada
); if(esCorrecto){
liberarProc(entrada);
printf("Proceso %s terminado\n", entrada
); }else{
esCorrecto
= scanf("$pp"); if(esCorrecto){
mostrarListaProc();
}else{
esCorrecto
= scanf("$frag"); if(esCorrecto){
memLibre();
}else{
esCorrecto
= scanf("$dump"); if(esCorrecto){
}else{
printf("El comando %s no existe", entrada
); }
}
}
}
}
}
}
}
}
}
}