Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010

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: