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 encriptar un fichero sin necesidad de crear una copia, o para poder crear herramientas como 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 vio en el apartado 8.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_08_16a.cs
// Lectura y escritura en fichero binario
// Introducción a C#, por Nacho Cabanes
using System;
using System.IO;
public class Ejemplo_08_16a
{
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
Ejercicios propuestos:
Ejercicio propuesto 8.16.1: Crea un programa que "encripte" el contenido de un fichero BMP, intercambiando los dos primeros bytes (y modificando el mismo fichero). Para desencriptar, bastará con volver a intercambiar esos dos bytes.
Ejercicios de repaso sobre ficheros:
Ejercicio propuesto 8.16.2: Crea 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.
Ejercicio propuesto 8.16.3: Un programa que vuelque todo el contenido de un fichero binario a otro, convirtiendo cada letra entre la A y la Z a mayúsculas. Los nombres de ambos ficheros se deben indican como parámetros en la línea de comandos. Si no hay parámetros, se le preguntarán al usuario.
Ejercicio propuesto 8.16.4: Mejora la base de datos de ficheros (ejemplo 04_06a) para que los datos almacenados se guarden automáticamente en fichero al terminar una ejecución, y se vuelvan a cargar al principio de la siguiente.
Ejercicio propuesto 8.16.5: Crea un "traductor básico de C# a C", que volcará todo el contenido de un fichero de texto a otro, pero reemplazando "Console.WriteLine" con "printf", "Main" con "main", "string" con "char[80]", "Console.ReadLine" con "scanf", y eliminando "static" y "public" y las líneas que comiencen con "Using".
Ejercicio propuesto 8.16.6: Prepara 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.
Ejercicio propuesto 8.16.7: Haz un programa que duplique un fichero, copiando todo su contenido a un nuevo fichero, byte a byte. El nombre del fichero de salida se tomará del nombre del fichero de entrada, al que se añadirá ".out".
Ejercicio propuesto 8.16.8: Crea un programa que duplique un fichero, copiando todo su contenido a un nuevo fichero, volcando para ello todo el contenido en un array. El nombre de ambos ficheros se debe leer de la línea de comandos, o pedir al usuario en caso de no existir parámetros.
Ejercicio propuesto 8.16.9: Crea un programa que compare si dos ficheros son iguales byte a byte, comprobando primero su tamaño y leyendo después cada vez un byte de cada uno de ellos.
Ejercicio propuesto 8.16.10: Crea un programa que compare si dos ficheros son iguales, volcando todo su contenido en sendos arrays, que compararás.
Ejercicio propuesto 8.16.11: 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 y sobre la cabecera ID3 V1, que se encuentra -si está presente- en los últimos 128 bytes del fichero).