Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Creación Apertura Lectura Escritura Recorrido Cierre

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 19

8.2.- Operaciones bsicas en archivos de texto y binarios.

Las operaciones bsicas en archivos son:


     

Creacin Apertura Lectura Escritura Recorrido Cierre

Archivos de texto.
El manejo de archivos de texto se puede llevar a cabo por medio de dos tipos de flujos: de bytes y de caracteres .

Archivos de Texto con Flujos de Bytes.


Para escribir o leer datos de tipo byte en un archivo se declara un flujo de la clase FileStream , cuyos constructores son: FileStream (string nombre , FileMode modo ) FileStream (string nombre , FileMode modo , FileAccess acceso ) donde: nombre es el nombre del archivo en disco, incluyendo la trayectoria.

Ejemplo:

"C: \\ POOISC \\ ARCHIVOS \\ archivo.txt" o su forma equivalente: @ "C: \ POOISC \ ARCHIVOS \ archivo.txt" modo es un valor del tipo enumerado FileMode ; puede tomar uno de los siguientes valores: Valor CreateNew Create Open OpenOrCreate Truncate Append Accin Crea un nuevo archivo. Si el archivo existe, lanzar una excepcin del tipo IOException. Crea un nuevo archivo. Si el archivo existe, ser sobreescrito. Abre un archivo existente. Abre un archivo, si existe;en caso contrario, se crea un nuevo archivo. Abre un archivo existente y lo trunca a cero bytes de longitud. Abre un archivo para agregarle datos al final.Si el archivo no existe, lo crea.

acceso es un valor del tipo enumerado FileAccess ; puede tomar uno de los siguientes valores: Valor Read ReadWrite Write Accin Permite leer un archivo. Permite leer o escribir en el archivo. permite escribir en el archivo.

Ejemplo 1:
// CEscribirBytes.cs using System; using System.IO; public class CEscribirBytes

{ public static void Main ( ) { FileStream fs = null; byte[] buffer = new byte[81]; int nbytes = 0, car; try { // Crea un flujo hacia el archivo texto.txt fs = new FileStream("texto.txt",FileMode.Create, FileAccess.Write); Console.WriteLine("Escriba el texto que desea almacenar en el archivo:"); while ((car = Console.Read()) != '\r' && (nbytes < buffer.Length)) { buffer[nbytes] = (byte)car; nbytes++; } // Escribe la lnea de texto en el archivo. fs.Write(buffer, 0, nbytes); } catch(IOException e) { Console.WriteLine("Error: " + e.Message); } finally { if (fs != null) fs.Close();

} } }

Ejemplo 2.
// CLeerBytes.cs using System; using System.IO; public class CLeerBytes { public static void Main ( ) { FileStream fe = null; char[] cBuffer = new char[81]; byte[] bBuffer = new byte[81]; int nbytes; try { // Crea un flujo desde el archivo texto.txt fe = new FileStream("texto.txt", FileMode.Open, FileAccess.Read); // Lee del archivo una lnea de texto nbytes = fe.Read(bBuffer, 0, 81); // Crea un objeto string con el texto ledo Array.Copy(bBuffer, cBuffer, bBuffer.Length); String str = new String(cBuffer, 0, nbytes); // Muestra el texto ledo

Console.WriteLine(str); } catch(IOException e) { Console.WriteLine("Error: " + e.Message); } finally { // Cierra el archivo. if (fe != null) fe.Close(); } } }

Archivos de Texto con Flujos de Caracteres.


En este caso los datos se manejan por medio de flujos de caracteres, utilizando las clases StreamWriter y StreamReader.

Escritura.
StreamWriter es una clase derivada de TextWriter. Sus constructores son: StreamWriter (string nombre ) // Abre un nuevo flujo para escribir en un // archivo especificado por nombre .

StreamWriter (Stream flujo ) // Utiliza un flujo existente para escribir. Antes de ser escritos, los datos son convertidos automticamente a un formato portable de 8 bits (UTF-8, UCS Transformation Format 8). Los objetos de la clase StreamWriter poseen varios mtodos, entre los que destacan: Write( ) , WriteLine( ) y Flush( ) . Adems, poseen la propiedad BaseStream .

Ejemplo:
// CEscribirCars.cs using System; using System.IO; public class CEscribirCars { public static void Main ( ) { StreamWriter sw = null; String str; try { // Crea un flujo hacia el archivo doc.txt // Si el archivo existe se destruye su contenido. sw = new StreamWriter("doc.txt"); Console.WriteLine("Escriba las lneas de texto a almacenar en el archivo.\n" + "Finalice cada lnea

pulsando la tecla <Entrar>.\n" + "Para finalizar pulse slo la tecla <Entrar>.\n"); // Lee una lnea de la entrada estndar str = Console.ReadLine(); // Mientras la cadena str no est vaca while (str.Length != 0) { // Escribe la lnea leda en el archivo sw.WriteLine(str); // Lee la lnea siguiente str = Console.ReadLine(); } } catch(IOException e) { Console.WriteLine("Error: " + e.Message); } finally { if (sw != null) sw.Close(); } } }

Lectura
StreamReader es una clase derivada de TextReader y cuenta con los siguientes constructores: StreamReader (string nombre ) abre un nuevo flujo para leer de un archivo especificado por nombre. StreamReader (Stream flujo ) utiliza un flujo existente para leer. Algunos de los mtodos ms importantes de la clase StreamReader son: Read( ) , ReadLine( ) , Peek( ) y DiscardBufferData( ) .

Ejemplo:
// CLeercars.cs using System; using System.IO; public class CLeerCars { public static void Main (string[] args) { StreamReader sr = null; String str; try { // Crea un flujo desde el archivo doc.txt sr = new StreamReader("doc.txt");

// Lee del archivo una lnea de texto str = sr.ReadLine(); // Mientras la cadena str no est vaca while (str != null) { // Muestra la lnea leda Console.WriteLine(str); // Lee la lnea siguiente str = sr.ReadLine(); } } catch(IOException e) { Console.WriteLine("Error: " + e.Message); } finally { // Cierra el archivo if (sr != null) sr.Close(); } } }

El siguiente programa pregunta al usuario si desea sobreescribir los datos existentes en el archivo.

// CEscribirCars2.cs using System; using System.IO; public class CEscribirCars { public static void Main ( ) { StreamWriter sw = null; String str; try { // Obtiene el nombre del archivo desde la entrada estndar Console.Write("Nombre del archivo: "); str = Console.ReadLine(); char resp = 's'; if ( File.Exists(str) ) { Console.Write("El archivo existe desea sobreescribirlo? (s/n) "); resp = (char)Console.Read(); // Salta los bytes no ledos del flujo de entrada estndar Console.ReadLine(); } if (resp != 's') return; // Crea un flujo hacia el archivo seleccionado por el usuario. sw = new StreamWriter(str); Console.WriteLine("Escriba las lneas de texto a almacenar en el archivo.\n" + "Finalice cada lnea pulsando la tecla <Entrar>.\n" + "Para finalizar pulse slo la tecla <Entrar>.\n");

// Lee una lnea de la entrada estndar str = Console.ReadLine(); // Mientras la cadena str no est vaca while (str.Length != 0) { // Escribe la lnea leda en el archivo sw.WriteLine(str); // Lee la lnea siguiente str = Console.ReadLine(); } } catch(UnauthorizedAccessException e) { Console.WriteLine("Error: " + e.Message); } catch(IOException e) { Console.WriteLine("Error: " + e.Message); } finally { if (sw != null) sw.Close(); } } }

El siguiente programa lee caracteres desde un archivo seleccionado por el usuario. // CLeecars2.cs using System; using System.IO; public class CLeerCars { public static void Main ( ) { StreamReader sr = null; String str; try { // Obtiene el nombre del archivo desde la entrada estndar do{ Console.Write("Nombre del archivo: "); str = Console.ReadLine(); } while (!File.Exists(str)); // Crea un flujo desde el archivo str sr = new StreamReader(str); // Lee del archivo una lnea de texto str = sr.ReadLine(); // Mientras la cadena str no est vaca while (str != null) { // Muestra la lnea leda Console.WriteLine(str);

// Lee la lnea siguiente str = sr.ReadLine(); } } catch(IOException e) { Console.WriteLine("Error: " + e.Message); } finally { // Cierra el archivo if (sr != null) sr.Close( ); } } }

Archivos Binarios
Cuando se requiere efectuar operaciones con datos de alguno de los tipos primitivos, tales datos debern escribirse y leerse en formato binario. El espacio de nombres System.IO proporciona las clases: BinaryWriter y BinaryReader. Con estas clases se podrn manipular datos de los tipos primitivos y cadenas de caracteres en formato UTF-8.

Los archivos escritos en formato binario no se pueden desplegar directamente en los dispositivos de salida estndar, como el monitor, sino que deben leerse a travs de flujos de la clase BinaryReader.

BinaryWriter crea flujos para escribir archivos con datos de los tipos primitivos en formato binario. Su constructor es: BinaryWriter ( Stream flujo ) y requiere, como parmetro, un flujo de la clase Stream o sus derivadas.

Ejemplo:
FileStream fs =new FileStream("datos.dat",FileMode. Create ,FileAccess. Write ); BinaryWriter bw=new BinaryWriter( fs ); Un objeto de la clase BinaryWriter acta como filtro entre el programa y un flujo de la clase FileStream. En la siguiente tabla se describen algunos de los principales mtodos y propiedades de la clase BinaryWriter : Mtodo / Propiedad Write(byte) Write(byte[]) Write(char) Write(char[]) Write(short) Write(int) Write(long) Write(Decimal) Write(float) Write(double) Write(string) Descripcin Escribe un valor de tipo byte. Escribe una cadena como una secuencia de bytes. Escribe un valor de tipo char. Escribe una cadena como una secuencia de caracteres. Escribe un valor de tipo short. Escribe un valor de tipo int. Escribe un valor de tipo long. Escribe un valor de tipo Decimal. Escribe un valor de tipo float. Escribe un valor de tipo double. Escribe una cadena de caracteres en formato UTF-8.

BaseStream Close Flush Seek

El primero o los dos primeros bytes especifican el nmero de bytes de datos escritos en la cadena. Obtiene el flujo base ( fs en el ejemplo mostrado). Cierra el flujo y libera los recursos adquiridos. Limpia el buffer asociado con el flujo. Establece el apuntador de Lectura/Escritura en el flujo.

BinaryReader crea flujos para leer archivos con datos de los tipos primitivos en formato binario, escritos por un flujo de la clase Binaryreader. Su constructor es: BinaryReader ( Stream flujo ) y requiere, como parmetro, un flujo de la clase Stream o sus derivadas. Ejemplo: FileStream fs =new FileStream("datos.dat",FileMode. Open ,FileAccess. Read ); BinaryReader br=new BinaryReader( fs ); Un objeto de la clase BinaryReader acta como filtro entre un flujo de la clase FileStream y el programa. En la siguiente tabla se describen algunos de los principales mtodos y propiedades de la clase BinaryReader : Mtodo / Propiedad Read(byte) Read (byte[]) Read (char) Read (char[]) Read (short) Read (int) Read (long) Read (Decimal) Descripcin Devuelve un valor de tipo byte. Devuelve una cadena como una secuencia de bytes. Devuelve un valor de tipo char. Devuelve una cadena como una secuencia de caracteres. Devuelve un valor de tipo short. Devuelve un valor de tipo int. Devuelve un valor de tipo long. Devuelve un valor de tipo Decimal.

Read (float) Read (double) Read (string)

BaseStream Close Flush PeekChar

Devuelve un valor de tipo float. Devuelve un valor de tipo double. Devuelve una cadena de caracteres en formato UTF8. El primero o los dos primeros bytes especifican el nmero de bytes de datos que sern ledos. Obtiene el flujo base ( fs en el ejemplo mostrado). Cierra el flujo y libera los recursos adquiridos. Limpia el buffer asociado con el flujo. Obtiene el siguiente carcter, sin extraerlo.

Acceso Aleatorio.
Cuando se abre un archivo, se puede acceder a sus registros de manera secuencial o de manera aleatoria . El acceso aleatorio consiste en posicionar el apuntador de archivo en una localidad especfica del archivo. Este tipo de acceso es necesario cuando se requiere modificar alguno de los campos de un registro. En lugar de leer desde el primero hasta el registro elegido, el apuntador se posiciona ,en una especie de salto, hasta dicho registro. El salto se hace con base al conteo de los bytes existentes entre una posicin inicial y el primer byte del registro elegido. Para el acceso aleatorio a los registros de un archivo, la clase FileStream implementa las propiedades Position y Length , as como el mtodo Seek( ) Position devuelve la posicin actual, en bytes, del apuntador de archivo . El apuntador de archivo marca el byte donde se har la siguiente operacin de lectura o de escritura. La declaracin de la propiedad Position es: public long Position ; La propiedad Length devuelve la longitud del archivo en bytes. Est declarada as: public long Length ;

El mtodo Seek( ) mueve el apuntador de archivo a una ubicacin localizada desp bytes, a partir de la posicin pos del archivo. La sintaxis para Seek( ) es: public long Seek( long desp , SeekOrigin pos ) El desplazamiento desp puede ser positivo o negativo. La posicin pos puede tomar uno de los siguientes valores del tipo enumerado SetOrigin . Begin ........ El inicio del archivo. Current ..... Posicin actual del apuntador de archivo. End ........... El final del archivo. Ejemplos: 1 .- Suponiendo un flujo fs de la clase FileStream . fs.Seek( desp , SeekOrigin. Begin ); fs.Seek( desp , SeekOrigin. Current ); fs.Seek( -desp , SeekOrigin. End ); El valor almacenado en desp debe calcularse en base al tamao de registro del archivo. 2 .- Suponiendo un flujo br de la clase BinaryReader . FileStream fs = new FileStream("datos", FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader( fs ); Debido a que el flujo br no soporta directamente el mtodo Seek( ) , tiene que acceder a l a travs de su propiedad BaseStream , como se muestra a continuacin:

br. BaseStream.Seek (desp, SeekOrigin.Current); Para facilitar el clculo del desplazamiento desp , es conveniente que todos los registros tengan la misma longitud.

En la figura anterior se muestra un archivo con 6 registros (numerados de 0 a 5) con 100 bytes de longitud cada uno. El desplazamiento para acceder al tercer registro se calcula de la siguiente manera: desp = Numero de registro * tamao de registro desp = 2*100 Es difcil recordar el nmero de registro al que se necesita acceder, por lo que se hace necesario establecer una relacin entre el nmero de registro y el valor almacenado en alguno de los campos del registro. Por ejemplo, si cada registro tiene un campo denominado clave , de tipo entero en el rango de 1 a N (que corresponde al nmero de control de un empleado), la relacin entre la clave y el nmero de registro es: nmero de registro = clave -1 As, el calculo del desplazamiento para el empleado con la clave 4 se efecta de la siguiente manera : desp = (4-1) * 100 = 300 Esto obliga a que, cuando se introduzcan los datos de un nuevo empleado , el nmero de su clave deba ser igual al nmero de registro +1 .

El nmero de registro que sigue es igual al nmero de registros existentes.

Pgina anterior

Pgina siguiente

L e 8 I E abo p

os m na .2.- O ra lm lt

ejores r rchivos d

esultados p et

ara c

odigo d inarios e nj

eo ava et

peraciones b

asicas

exto y b sicas e

peraciones b exto ea ed

na

rchivos d

exto y b

inarios.

anejo d or m edio d

rchivos d os t

et ipos d

exto s ef

ep lujos: d

uede l e ... I

levar a c ra lt

exto

También podría gustarte