CLR: .Net / Mono / Boo / Otros CLR > C#
C# flujo de archivos binarios
(1/1)
Chuy1994:
Alguien que me pudiera ayudar con este programa, el problema es cuando agrego 2 registros y elimino uno de ellos y al desplegarlos me marcar error
aqui esta mi codigo:
--- Código: C# --- using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO; namespace ConsoleApplication1{ public class Empleado { private string nombre, puesto, domicilo, email, telefono; private float sueldo; public Empleado() { } // constructor por default public Empleado(string n, string p, float s, string dom, string tel, string eml) //constructor empleado { nombre = n; puesto = p; sueldo = s; domicilo = dom; telefono = tel; email = eml; } public void asignaNombre(string n) { nombre = n; } public string obtenNombre() { return nombre; } public void asignaPuesto(string p) { puesto = p; } public string obtenPuesto() { return puesto; } public void asignaSueldo(float s) { sueldo = s; } public float obtenSueldo() { return sueldo; } public void asgniaDomicilio(string dom) { domicilo = dom; } public string obtenDomicilio() { return domicilo; } public void asignaTelefono(string tel) { telefono = tel; } public string obtenTelefono() { return telefono; } public void asignaEmail(string eml) { email = eml; } public string obtenEmail() { return email; } } public class ArchivoEmpleados { private FileStream fs=null; //Flujo base. private BinaryWriter bw=null; // Flujo de escritura private BinaryReader br=null; // Flujo de lectura public ushort nregs; // Numero de registros en el archivo public static ushort tamanoRegistro = 82; //Tamano del registro, en bytes, se agregan 2 bytes por cada string. public ushort c; public string n, p, dom, emal, tel; public float s; public ArchivoEmpleados(string archivo)//Constructor archivo { fs = new FileStream(archivo, FileMode.OpenOrCreate, FileAccess.ReadWrite); bw = new BinaryWriter(fs); br = new BinaryReader(fs); nregs = (ushort)Math.Ceiling((double)fs.Length / (double)tamanoRegistro); } public void cierraArchivo() { bw.Close(); br.Close(); fs.Close(); } public ushort obtenNumeroDeRegistros() { return nregs; } public void escribeRegistro(ushort clave, Empleado empleado) { if (clave > 0 && clave <= (nregs + 1)) { bw.BaseStream.Seek((clave - 1) * tamanoRegistro, SeekOrigin.Begin); bw.Write(empleado.obtenNombre()); bw.Write(empleado.obtenPuesto()); bw.Write(empleado.obtenSueldo()); bw.Write(empleado.obtenDomicilio()); bw.Write(empleado.obtenTelefono()); bw.Write(empleado.obtenEmail()); } else { Console.WriteLine("Clave incorrecta..."); } } public void captura() { try { Console.Write("Nombre: "); n = Console.ReadLine(); n = n.PadRight(50); Console.Write("Puesto: "); p = Console.ReadLine(); p = p.PadRight(20); Console.Write("Sueldo: "); s = Single.Parse(Console.ReadLine()); Console.Write("Domicilio: "); dom = Console.ReadLine(); dom = dom.PadRight(100); Console.Write("Telefono: "); tel = Console.ReadLine(); Console.Write("Email: "); emal = Console.ReadLine(); emal = emal.PadRight(100); } catch (FormatException fex) { Console.WriteLine("nMensaje del Error: " + fex.Message); Console.WriteLine("nRuta del Error: " + fex.StackTrace); Console.WriteLine("nPresione <Enter> para Continuar... "); Console.ReadKey(); } } public void anadeRegistro(Empleado empleado) { nregs++; bw.BaseStream.Seek(nregs * tamanoRegistro, SeekOrigin.Begin); captura(); escribeRegistro(nregs, new Empleado(n, p, s, dom, tel, emal)); } public Empleado leeRegistro(ushort reg) { if (reg >= 0 && reg < nregs) { br.BaseStream.Seek(reg * tamanoRegistro,SeekOrigin.Begin); n = br.ReadString(); p = br.ReadString(); s = br.ReadSingle(); dom = br.ReadString(); tel = br.ReadString(); emal = br.ReadString(); return new Empleado(n, p, s, dom, tel, emal); } else { Console.WriteLine("Clave incorrecta..."); return null; } } public void buscaRegistro() { try { do { Console.Write("Clave: "); c = UInt16.Parse(Console.ReadLine()); }while (c < 1 && c > nregs); br.BaseStream.Seek((c - 1) * tamanoRegistro, SeekOrigin.Begin); n = br.ReadString(); n = n.TrimEnd(' '); p = br.ReadString(); p = p.TrimEnd(' '); s = br.ReadSingle(); dom = br.ReadString(); dom = dom.TrimEnd(' '); tel = br.ReadString(); tel = tel.TrimEnd(' '); emal = br.ReadString(); emal = emal.TrimEnd(' '); Console.Clear(); Console.Write("nClave> " + c); Console.Write("nNombre: " + n); Console.Write("nPuesto: " + p); Console.Write("nSueldo: {0:F2} ", s); Console.Write("nDomicilio: " + dom); Console.Write("nTelefono: " + tel); Console.Write("nEmail: " + emal); Console.WriteLine("nnPresione <Enter> para Continuar..."); Console.ReadLine(); br.BaseStream.Seek((c - 1) * tamanoRegistro, SeekOrigin.Begin); } catch (FormatException fex) { Console.WriteLine("nMensaje del Error: " + fex.Message); Console.WriteLine("nRuta del Error: " + fex.StackTrace); Console.WriteLine("nPresione <Enter> para Continuar... "); Console.ReadKey(); } catch (IOException ioex) { Console.WriteLine("nMensaje del Error: " + ioex.Message); Console.WriteLine("nRuta del Error: " + ioex.StackTrace); Console.WriteLine("nPresione <Enter> para Continuar... "); Console.ReadKey(); } } public void cambiaRegistro() { buscaRegistro(); Console.Write("nDesea cambiarlo(S/N)? : "); char op; do { op = (char)Console.Read(); op = Char.ToUpper(op); } while (op != 'N' && op != 'S'); Console.ReadLine(); if (op == 'S') { captura(); Empleado e = new Empleado(n, p, s, dom, tel, emal); escribeRegistro((ushort)(c), e); } } public void desplieguaRegistros() { Console.Clear(); int i; for (i = 0; br.BaseStream.Length != br.BaseStream.Position; i++) { br.BaseStream.Seek(i * tamanoRegistro, SeekOrigin.Begin); n = br.ReadString(); n = n.TrimEnd(' '); p = br.ReadString(); p = p.TrimEnd(' '); s = br.ReadSingle(); dom = br.ReadString(); dom = dom.TrimEnd(' '); tel = br.ReadString(); tel = tel.TrimEnd(); emal = br.ReadString(); emal = emal.TrimEnd(' '); Console.Write("nn------------------------nClave: " + (i + 1)); Console.Write("nNombre: " + n); Console.Write("nPuesto: " + p); Console.Write("nSueldo: {0:F2}", s); Console.Write("nDomicilio: " + dom); Console.Write("nTelefono: " + tel); Console.Write("nEmail: " + emal); } Console.WriteLine("nnPresione <Enter> para Continuar..."); Console.ReadLine(); br.BaseStream.Seek(0, SeekOrigin.Begin); } public void eliminaRegistro() { buscaRegistro(); Console.Write("nDesea elimiarlo? (S/N): "); char op; do { op = (char)Console.Read(); op = Char.ToUpper(op); } while (op != 'N' && op != 'S'); if (op == 'S') { n = "Registro Eliminado"; n = n.PadRight(50); p = "Registro Eliminado"; p = p.PadRight(50); s = 0; Empleado e = new Empleado(n, p, s, dom, tel, emal); escribeRegistro(c, e); } } } public class Principal { static ArchivoEmpleados arEmp; public static char menu() { Console.Clear(); Console.WriteLine("A.- Agregar. "); Console.WriteLine("B.- Buscar. "); Console.WriteLine("C.- Cambiar. "); Console.WriteLine("D.- Desplegar. "); Console.WriteLine("E.- Eliminar. "); Console.WriteLine("S.- Salir. "); Console.Write("nOpcion: "); char op; op = (char)Console.Read(); op = Char.ToUpper(op); Console.WriteLine(); Console.ReadLine(); return op; } public static void Main(string[] args) { string archivo = "Empleados.dat"; arEmp = new ArchivoEmpleados(archivo); char opcion; do { opcion = menu(); opcion = Char.ToUpper(opcion); switch (opcion) { case 'A': { arEmp.anadeRegistro(new Empleado(arEmp.n, arEmp.p, arEmp.s, arEmp.dom, arEmp.tel, arEmp.emal)); } break; case 'B': { arEmp.buscaRegistro(); } break; case 'C': { arEmp.cambiaRegistro(); } break; case 'D': { arEmp.desplieguaRegistros(); } break; case 'E': { arEmp.eliminaRegistro(); } break; case 'S': { arEmp.cierraArchivo(); Console.Clear(); Console.WriteLine("Fin del Programa!!!"); Console.WriteLine("nPresione <Enter> para Salir.."); Console.ReadLine(); } break; default: { Console.WriteLine("Opcion no valida! Presione <Enter> para continuar.."); Console.ReadKey(); } break; } } while (opcion != 'S'); } }}
Navegación
Ir a la versión completa