Pascal/Turbo Pascal - comprobación entrada/salida

 
Vista:

comprobación entrada/salida

Publicado por glinecco (1 intervención) el 09/09/2002 18:00:42
Hola, estoy aprendiendo pascal y desarrollando un programa en el cual se manejan archivos de texto.
El caso es que conozco como utilizar las directivas de compilación {$I-} y {$I+} para evitar que el programa se interrumpa si por ejemplo no se encuentra un archivo determinado.
Lo que no consigo averiguar es como crear algún tipo de iteración para que si no ha sido posible encontrar el archivo, dar la oportunidad al usuario de volver a intentarlo, de volver a introducir la ruta del archivo sin tener que cerrar y volver a abrir el programa.
Lo he intentado utilizando bucles anidados, con label y goto...pero algo aparentemente tan sencillo nunca funciona. En el segundo intento es como si ignorase la variable del nombre del archivo.
En fin, agradezco por antelación cualquier tipo de sugerencia que pueda ayudarme. Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:comprobación entrada/salida

Publicado por Diego Romero (786 intervenciones) el 10/09/2002 02:35:53
Me da la sensación de que tienes problemas en las asignaciones, debería ver el código para decirte si es así, de cualquier modo creo que deberías resolverlo paso a paso.
Cuando se intenta abrir un archivo pueden ocurrir varias excepciones según qué tipo de apertura le hagas.
Por ejemplo intentar abrir un archivo en modo solo lectura (reset) de un archivo que el sistema operativo tiene marcado como de solo lectura no causará ninguna excepción pero si intentas abrirlo en modo lectura/escritura (append para text) sí causará excepción.
Lo siguiente más grave que puede pasar es que el archivo no exista, restringiendose a estas dos posibilidades el algoritmo sería

repeat
cancelado:=pedir_nombre_fisico(Nombre_Fisico);
if not cancelado then exito:=Intentar_Abrir(Nombre_Fisico);
until exito or cancelado;
if cancelado = then writeln('Cancelado por el usuario.');

donde pedir_nombre_fisico sería una función que asigne a Nombre_Fisico el nombre fisico del archivo que el usuario elija y además devuelva si el usuario no desea abrir archivo alguno (ha cancelado), si no ha cancelado la función intentar_abrir tratará de abrir el archivo en cuestión y devolverá verdadero si pudo hacerlo o falso si no, opcionalmente podría devolver el código de error tomado con ioresult para que luego se muestre un mensaje apropiado.
Todo esto encerrado en un ciclo repeat pues se debe ejecutar sí o sí al menos una vez, la salida del ciclo es si se ha tenido exito al abrir el archivo (el archivo existe y se puede usar bajo las condiciones necesarias) o el usuario ha cancelado la apertura.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:comprobación entrada/salida

Publicado por Roberto (128 intervenciones) el 12/09/2002 05:21:38
repeat
write('Archivo: ');
readln(ruta);
{$I-}
reset(archivo,ruta);
{$I+]
until ioresult = 0

Tambien podrias asignar el valor de ioresult a otra variable para verificar si el error es debido a problemas de hardware (por si falla la unidad o por si el disco esta dañado) para poder salir en esas situaciones
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar