7.14. Leer y escribir en un mismo fichero binario
También es posible que nos interese leer y escribir en un mismo fichero (por ejemplo, para poder modificar algún dato erróneo, o para poder crear un editor hexadecimal). Podemos conseguirlo abriendo (en modo de lectura o de escritura) o cerrando el fichero cada vez, pero también tenemos la alternativa de usar un "FileStream", que también tiene un método llamado simplemente "Open", al que se le puede indicar el modo de apertura (FileMode, como se vieron en el apartado 7.12) y el modo de acceso (FileAccess.Read si queremos leer, FileAccess.Write si queremos escribir, o FileAccess.ReadWrite si queremos leer y escribir).
Una vez que hayamos indicado que queremos leer y escribir del fichero, podremos movernos dentro de él con "Seek", leer datos con "Read" o "ReadByte", y grabar datos con "Write" o "WriteByte":
/*---------------------------*/ /* Ejemplo en C# nº 85: */ /* ejemplo85.cs */ /* */ /* Ficheros binarios (9): */ /* Lectura y Escritura */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; using System.IO; public class Ejemplo85 { const int TAMANYO_BUFFER = 10; public static void Main() { FileStream fichero; string nombre; byte[] datos; nombre = "datos.dat"; datos = new byte[TAMANYO_BUFFER]; // Damos valores iniciales al array for (byte i = 0; i < TAMANYO_BUFFER; i++) datos[i] = (byte)(i + 10); try { int posicion = 0; // Primero creamos el fichero, con algun dato fichero = File.Create(nombre); fichero.Write(datos, posicion, TAMANYO_BUFFER); fichero.Close(); // Ahora leemos dos datos fichero = File.Open(nombre, FileMode.Open, FileAccess.ReadWrite); fichero.Seek(2, SeekOrigin.Begin); int nuevoDato = fichero.ReadByte(); Console.WriteLine("El tercer byte es un {0}", nuevoDato); fichero.Seek(2, SeekOrigin.Begin); fichero.WriteByte(4); fichero.Seek(2, SeekOrigin.Begin); nuevoDato = fichero.ReadByte(); Console.WriteLine("Ahora el tercer byte es un {0}", nuevoDato); fichero.Close(); } catch (Exception exp) { Console.WriteLine(exp.Message); return; } } }
Ejercicios propuestos:
- Un programa que vuelque todo el contenido de un fichero de texto a otro, convirtiendo cada frase a mayúsculas. Los nombres de ambos ficheros se deben indican como parámetros en la línea de comandos.
- Un programa que pida al usuario el nombre de un fichero de texto y una frase a buscar, y que muestre en pantalla todas las frases de ese fichero que contengan esa frase. Cada frase se debe preceder del número de línea (la primera línea del fichero será la 1, la segunda será la 2, y así sucesivamente).
- Un programa que pida al usuario el nombre de un fichero y una secuencia de 4 bytes, y diga si el fichero contiene esa secuencia de bytes.
- Un programa que duplique un fichero, copiando todo su contenido a un nuevo fichero. El nombre de ambos ficheros se debe leer de la línea de comandos.
- Un programa que muestre el nombre del autor de un fichero de música en formato MP3 (tendrás que localizar en Internet la información sobre dicho formato).