7. Manejo de ficheros
7.1. Escritura en un fichero de texto
Para manejar ficheros, siempre deberemos realizar tres operaciones básicas:
- Abrir el fichero.
- Leer datos de él o escribir datos en él.
- Cerrar el fichero.
Eso sí, no siempre podremos realizar esas operaciones, así que además tendremos que comprobar los posibles errores. Por ejemplo, puede ocurrir que intentemos abrir un fichero que realmente no exista, o que queramos escribir en un dispositivo que sea sólo de lectura.
Vamos a ver un ejemplo, que cree un fichero de texto y escriba algo en él:/*---------------------------*/ /* Ejemplo en C# nº 70 */ /* ejemplo70.cs */ /* */ /* Escritura en un fichero */ /* de texto */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; using System.IO; // Para StreamWriter public class Ejemplo70 { public static void Main() { StreamWriter fichero; fichero = File.CreateText("prueba.txt"); fichero.WriteLine("Esto es una lÃnea"); fichero.Write("Esto es otra"); fichero.WriteLine(" y esto es continuación de la anterior"); fichero.Close(); } }
Hay varias cosas que comentar sobre este programa:
- StreamWriter es la clase que representa a un fichero en el que podemos escribir.
- El fichero de texto lo creamos con el método CreateText, que pertenece a la clase File.
- Para escribir en el fichero, empleamos Write y WriteLine, al igual que en la consola.
- Finalmente, debemos cerrar el fichero con Close, o podría quedar algún dato sin guardar.
Ejercicios propuestos:
- Crea un programa que vaya leyendo las frases que el usuario teclea y las guarde en un fichero de texto. Terminará cuando la frase introducida sea "fin" (esa frase no deberá guardarse en el fichero).
7.2. Lectura de un fichero de texto
La estructura de un programa que leyera de un fichero de texto sería parecida:
/*---------------------------*/ /* Ejemplo en C# nº 71: */ /* ejemplo71.cs */ /* */ /* Lectura de un fichero de */ /* texto */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; using System.IO; // Para StreamReader public class Ejemplo71 { public static void Main() { StreamReader fichero; string linea; fichero = File.OpenText("prueba.txt"); linea = fichero.ReadLine(); Console.WriteLine( linea ); Console.WriteLine( fichero.ReadLine() ); fichero.Close(); } }
Las diferencias son:
- Para leer de un fichero no usaremos StreamWriter, sino StreamReader.
- Si queremos abrir un fichero que ya existe, usaremos OpenText, en lugar de CreateText.
- Para leer del fichero, usaríamos ReadLine, como hacíamos en la consola.
- Nuevamente, deberemos cerrar el fichero al terminar de usarlo.
Ejercicios propuestos:
- Crea un programa que lea las tres primeras líneas del fichero creado en el apartado anterior y las muestre en pantalla.
7.3. Lectura hasta el final del fichero
Normalmente no querremos leer sólo una frase del fichero, sino procesar todo su contenido, de principio a fin
En un fichero de texto, la forma de saber si hemos llegado al final es intentar leer una línea, y comprobar si el resultado ha sido "null", lo que nos indicaría que no se ha podido leer y que, por tanto estamos en el final del fichero.
Normalmente, si queremos procesar todo un fichero, esta lectura y comprobación debería ser repetitiva, así:
/*---------------------------*/ /* Ejemplo en C# nº 72: */ /* ejemplo72.cs */ /* */ /* Lectura de un fichero de */ /* texto */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; using System.IO; // Para StreamReader public class Ejemplo72 { public static void Main() { StreamReader fichero; string linea; fichero = File.OpenText("prueba.txt"); do { linea = fichero.ReadLine(); if (linea != null) Console.WriteLine( linea ); } while (linea != null); fichero.Close(); } }
Ejercicios propuestos:
- Un programa que pida al usuario que teclee frases, y las almacene en el fichero "frases.txt". Acabará cuando el usuario pulse Intro sin teclear nada. Después deberá mostrar el contenido del fichero.
- Un programa que pregunte un nombre de fichero y muestre en pantalla el contenido de ese fichero, haciendo una pausa después de cada 25 líneas, para que dé tiempo a leerlo. Cuando el usuario pulse intro, se mostrarán las siguientes 25 líneas, y así hasta que termine el fichero.