AnteriorPosterior

Tema 11: Manejo de ficheros (2: Escribir ficheros de texto)

  Curso: Curso de Pascal, por Nacho Cabanes

Curso de Pascal. Tema 11: Manejo de ficheros.

Tema 11.1. Manejo de ficheros (2) - Escribir en un fichero de texto.

Este fichero está abierto para lectura. Si queremos abrirlo para escritura, empleamos "rewrite" en vez de "reset", pero esta orden hay que utilizarla con cuidado, porque si el fichero ya existe lo machacaría, dejando el nuevo en su lugar, y perdiendo los datos anteriores. Más adelante veremos cómo comprobar si el fichero ya existe.

Para abrir el fichero para añadir texto al final, usaríamos "append" en vez de "reset". En ambos casos, los datos se escribirían con

writeln( fichero, linea );


Ejercicio propuesto: realizar un programa que cree un fichero llamado "datos.txt", que contenga dos líneas de información. La primera será la palabra "Hola" y la segunda será la frase "Que tal?"




Una limitación que puede parecer importante es eso de que el fichero debe existir, y si no el programa se interrumpe. En la práctica, esto no es tan drástico. Hay una forma de comprobarlo, que es con una de las llamadas "directivas de compilación". Obligamos al compilador a que temporalmente no compruebe las entradas y salidas, y lo hacemos nosotros mismos. Después volvemos a habilitar las comprobaciones. Ahí va un ejemplo de cómo se hace esto:

 {--------------------------} 
 {  Ejemplo en Pascal:      } 
 {                          } 
 {    Muestra AUTOEXEC.BAT  } 
 {    comprobando errores   } 
 {    MAEXEC2.PAS           } 
 {                          } 
 {  Este fuente procede de  } 
 {  CUPAS, curso de Pascal  } 
 {  por Nacho Cabanes       } 
 {                          } 
 {  Comprobado con:         } 
 {    - Free Pascal 2.2.0w  }
 {    - Turbo Pascal 7.0    } 
 {--------------------------} 

 program MuestraAutoexec2; 

 var 

   fichero: text;                         (* Fichero de texto *) 
   linea: string;                         (* Línea que leemos *) 

 begin 
   assign( fichero, 'C:\AUTOEXEC.BAT' );  (* Le asignamos el nombre *) 
   {$I-}                                  (* Deshabilita comprobación
                                             de entrada/salida *) 
   reset( fichero );                    (* Lo intentamos abrir *) 
   {$I+}                                (* La habilitamos otra vez *) 

   if ioResult = 0 then                 (* Si todo ha ido bien *) 
     begin 
     while not eof( fichero ) do        (* Mientras que no se acabe *) 
       begin 
       readln( fichero, linea );        (* Leemos una línea *) 
       writeln( linea );                (* y la mostramos *) 
       end; 
     close( fichero );                  (* Se acabó: lo cerramos *) 
     end;                               (* Final del "if" *) 
 end.

De modo que {$I-} deshabilita la comprobación de las operaciones de entrada y salida, {$I+} la vuelve a habilitar, y "ioresult" devuelve un número que indica si la última operación de entrada/salida ha sido correcta (cero) o no (otro número, que indica el tipo de error).


Para terminar (al menos momentáneamente) con los ficheros de texto, vamos a ver un pequeño ejemplo, que muestre cómo leer de un fichero y escribir en otro.

Lo que haremos será leer el AUTOEXEC.BAT y crear una copia en el directorio actual llamada AUTOEXEC.BAN (la orden del DOS equivalente sería COPY C:\AUTOEXEC.BAT AUTOEXE.BAN):

 {--------------------------} 
 {  Ejemplo en Pascal:      } 
 {                          } 
 {    Copia AUTOEXEC.BAT    } 
 {    CAEXEC1.PAS           } 
 {                          } 
 {  Este fuente procede de  } 
 {  CUPAS, curso de Pascal  } 
 {  por Nacho Cabanes       } 
 {                          } 
 {  Comprobado con:         } 
 {    - Turbo Pascal 7.0    } 
 {    - Free Pascal 2.0.2   } 
 {    - Tmt Pascal Lt 1.20  } 
 {--------------------------} 

 program CopiaAutoexec; 

 var 
   fichero1, fichero2: text;              (* Ficheros de texto *) 
   linea: string;                         (* Línea actual *) 

 begin 
   assign( fichero1, 'C:\AUTOEXEC.BAT' );  (* Le asignamos nombre *) 
   assign( fichero2, 'AUTOEXEC.BAN' );     (* y al otro *) 
   {$I-}                                 (* Sin comprobación E/S *) 
   reset( fichero1 );                    (* Intentamos abrir uno *) 
   {$I+}                                 (* La habilitamos otra vez *) 
   if ioResult = 0 then                  (* Si todo ha ido bien *) 
     begin 
     rewrite( fichero2 );                (* Abrimos el otro *) 
     while not eof( fichero1 ) do        (* Mientras que no acabe 1 *) 
       begin 
       readln( fichero1, linea );        (* Leemos una línea *) 
       writeln( fichero2, linea );       (* y la escribimos *) 
       end; 
     writeln( 'Ya está ');               (* Se acabó: avisamos, *) 
     close( fichero1 );                  (* cerramos uno *) 
     close( fichero2 );                  (* y el otro *) 
     end                                 (* Final del "if" *) 
   else 
     writeln(' No he encontrado el fichero! ');     (* Si no existe *) 
 end.

Eso es todo por ahora. Como ejercicios propuestos:

  • Un programa que vaya grabando en un fichero lo que nosotros tecleemos, como haríamos en el DOS con COPY CON FICHERO.EXT
  • Un programa que copie el AUTOEXEC.BAT excluyendo aquellas líneas que empiecen por K o P (mayúsculas o minúsculas).
  • Un programa que elimine los espacios innecesarios al final de cada línea de un fichero ASCII. Debe pedir el nombre del fichero de entrada y el de salida, y salir con un mensaje de error si no existe el fichero de entrada o si existe ya uno con el nombre que queremos dar al de salida.

Actualizado el: 28-07-2006 22:06

AnteriorPosterior