• Domingo 22 de Diciembre de 2024, 15:34

Autor Tema:  C# flujo de archivos binarios  (Leído 2852 veces)

Chuy1994

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
C# flujo de archivos binarios
« en: Viernes 27 de Mayo de 2011, 03:50 »
0
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#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.IO;
  7.  
  8. namespace ConsoleApplication1
  9. {
  10.  
  11.     public class Empleado
  12.     {
  13.         private string nombre, puesto, domicilo, email, telefono;
  14.         private float sueldo;
  15.  
  16.         public Empleado()
  17.         { }
  18.         // constructor por default
  19.  
  20.         public Empleado(string n, string p, float s, string dom, string tel, string eml) //constructor empleado
  21.         {
  22.             nombre = n;
  23.             puesto = p;
  24.             sueldo = s;
  25.             domicilo = dom;
  26.             telefono = tel;
  27.             email = eml;
  28.  
  29.         }
  30.  
  31.         public void asignaNombre(string n)
  32.        
  33.         { nombre = n; }
  34.  
  35.         public string obtenNombre()
  36.         { return nombre; }
  37.  
  38.         public void asignaPuesto(string p)
  39.         { puesto = p; }
  40.  
  41.         public string obtenPuesto()
  42.         { return puesto; }
  43.  
  44.         public void asignaSueldo(float s)
  45.         { sueldo = s; }
  46.  
  47.         public float obtenSueldo()
  48.         { return sueldo; }
  49.  
  50.         public void asgniaDomicilio(string dom)
  51.         { domicilo = dom; }
  52.  
  53.         public string obtenDomicilio()
  54.         { return domicilo; }
  55.  
  56.         public void asignaTelefono(string tel)
  57.         { telefono = tel; }
  58.  
  59.         public string obtenTelefono()
  60.         { return telefono; }
  61.  
  62.         public void asignaEmail(string eml)
  63.         { email = eml; }
  64.  
  65.         public string obtenEmail()
  66.         { return email; }
  67.    
  68.     }
  69.  
  70.     public class ArchivoEmpleados
  71.     {
  72.         private FileStream fs=null; //Flujo base.
  73.         private BinaryWriter bw=null; // Flujo de escritura
  74.         private BinaryReader br=null; // Flujo de lectura
  75.         public ushort nregs; // Numero de registros en el archivo
  76.         public static ushort tamanoRegistro = 82; //Tamano del registro, en bytes, se agregan 2 bytes por cada string.
  77.         public ushort c;
  78.         public string n, p, dom, emal, tel;
  79.         public float s;
  80.  
  81.         public ArchivoEmpleados(string archivo)//Constructor archivo
  82.         {
  83.             fs = new FileStream(archivo, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  84.             bw = new BinaryWriter(fs);
  85.             br = new BinaryReader(fs);
  86.             nregs = (ushort)Math.Ceiling((double)fs.Length / (double)tamanoRegistro);
  87.         }
  88.  
  89.         public void cierraArchivo()
  90.         {
  91.             bw.Close();
  92.             br.Close();
  93.             fs.Close();
  94.         }
  95.  
  96.         public ushort obtenNumeroDeRegistros()
  97.         { return nregs; }
  98.  
  99.         public void escribeRegistro(ushort clave, Empleado empleado)
  100.         {
  101.  
  102.             if (clave > 0 && clave <= (nregs + 1))
  103.             {
  104.                 bw.BaseStream.Seek((clave - 1) * tamanoRegistro, SeekOrigin.Begin);
  105.                 bw.Write(empleado.obtenNombre());
  106.                 bw.Write(empleado.obtenPuesto());
  107.                 bw.Write(empleado.obtenSueldo());
  108.                 bw.Write(empleado.obtenDomicilio());
  109.                 bw.Write(empleado.obtenTelefono());
  110.                 bw.Write(empleado.obtenEmail());
  111.             }
  112.  
  113.             else
  114.             { Console.WriteLine("Clave incorrecta..."); }
  115.         }
  116.  
  117.         public void captura()
  118.         {
  119.             try
  120.             {
  121.                 Console.Write("Nombre: ");
  122.                 n = Console.ReadLine();
  123.                 n = n.PadRight(50);
  124.                 Console.Write("Puesto: ");
  125.                 p = Console.ReadLine();
  126.                 p = p.PadRight(20);
  127.                 Console.Write("Sueldo: ");
  128.                 s = Single.Parse(Console.ReadLine());
  129.                 Console.Write("Domicilio: ");
  130.                 dom = Console.ReadLine();
  131.                 dom = dom.PadRight(100);
  132.                 Console.Write("Telefono: ");
  133.                 tel = Console.ReadLine();
  134.                 Console.Write("Email: ");
  135.                 emal = Console.ReadLine();
  136.                 emal = emal.PadRight(100);
  137.             }
  138.             catch (FormatException fex)
  139.             {
  140.                 Console.WriteLine("nMensaje del Error: " + fex.Message);
  141.                 Console.WriteLine("nRuta del Error: " + fex.StackTrace);
  142.                 Console.WriteLine("nPresione <Enter> para Continuar... ");
  143.                 Console.ReadKey();
  144.             }
  145.         }
  146.  
  147.         public void anadeRegistro(Empleado empleado)
  148.         {
  149.             nregs++;
  150.             bw.BaseStream.Seek(nregs * tamanoRegistro, SeekOrigin.Begin);
  151.             captura();
  152.             escribeRegistro(nregs, new Empleado(n, p, s, dom, tel, emal));
  153.         }
  154.  
  155.         public Empleado leeRegistro(ushort reg)
  156.         {
  157.             if (reg >= 0 && reg < nregs)
  158.             {
  159.                 br.BaseStream.Seek(reg * tamanoRegistro,SeekOrigin.Begin);
  160.                 n = br.ReadString();
  161.                 p = br.ReadString();
  162.                 s = br.ReadSingle();
  163.                 dom = br.ReadString();
  164.                 tel = br.ReadString();
  165.                 emal = br.ReadString();
  166.                 return new Empleado(n, p, s, dom, tel, emal);
  167.             }
  168.  
  169.             else
  170.             {
  171.                 Console.WriteLine("Clave incorrecta...");
  172.                 return null;
  173.             }
  174.         }
  175.  
  176.         public void buscaRegistro()
  177.         {
  178.             try
  179.             {
  180.                 do
  181.                 {
  182.                     Console.Write("Clave: ");
  183.                     c = UInt16.Parse(Console.ReadLine());
  184.                 }while (c < 1 && c > nregs);
  185.  
  186.                 br.BaseStream.Seek((c - 1) * tamanoRegistro, SeekOrigin.Begin);
  187.                 n = br.ReadString();
  188.                 n = n.TrimEnd(' ');
  189.                 p = br.ReadString();
  190.                 p = p.TrimEnd(' ');
  191.                 s = br.ReadSingle();
  192.                 dom = br.ReadString();
  193.                 dom = dom.TrimEnd(' ');
  194.                 tel = br.ReadString();
  195.                 tel = tel.TrimEnd(' ');
  196.                 emal = br.ReadString();
  197.                 emal = emal.TrimEnd(' ');
  198.                 Console.Clear();
  199.                 Console.Write("nClave> " + c);
  200.                 Console.Write("nNombre: " + n);
  201.                 Console.Write("nPuesto: " + p);
  202.                 Console.Write("nSueldo: {0:F2} ", s);
  203.                 Console.Write("nDomicilio: " + dom);
  204.                 Console.Write("nTelefono: " + tel);
  205.                 Console.Write("nEmail: " + emal);
  206.                 Console.WriteLine("nnPresione <Enter> para Continuar...");
  207.                 Console.ReadLine();
  208.                 br.BaseStream.Seek((c - 1) * tamanoRegistro, SeekOrigin.Begin);
  209.             }
  210.  
  211.             catch (FormatException fex)
  212.             {
  213.                 Console.WriteLine("nMensaje del Error: " + fex.Message);
  214.                 Console.WriteLine("nRuta del Error: " + fex.StackTrace);
  215.                 Console.WriteLine("nPresione <Enter> para Continuar... ");
  216.                 Console.ReadKey();
  217.  
  218.             }
  219.  
  220.             catch (IOException ioex)
  221.             {
  222.                 Console.WriteLine("nMensaje del Error: " + ioex.Message);
  223.                 Console.WriteLine("nRuta del Error: " + ioex.StackTrace);
  224.                 Console.WriteLine("nPresione <Enter> para Continuar... ");
  225.                 Console.ReadKey();
  226.             }
  227.         }
  228.  
  229.         public void cambiaRegistro()
  230.         {
  231.             buscaRegistro();
  232.             Console.Write("nDesea cambiarlo(S/N)? : ");
  233.             char op;
  234.  
  235.             do
  236.             {
  237.                 op = (char)Console.Read();
  238.                 op = Char.ToUpper(op);
  239.             }
  240.  
  241.             while (op != 'N' && op != 'S');
  242.  
  243.             Console.ReadLine();
  244.  
  245.             if (op == 'S')
  246.             {
  247.                 captura();
  248.                 Empleado e = new Empleado(n, p, s, dom, tel, emal);
  249.                 escribeRegistro((ushort)(c), e);
  250.             }
  251.         }
  252.  
  253.         public void desplieguaRegistros()
  254.         {
  255.             Console.Clear();
  256.             int i;
  257.             for (i = 0; br.BaseStream.Length != br.BaseStream.Position; i++)
  258.             {
  259.                 br.BaseStream.Seek(i * tamanoRegistro, SeekOrigin.Begin);
  260.                 n = br.ReadString();
  261.                 n = n.TrimEnd(' ');
  262.                 p = br.ReadString();
  263.                 p = p.TrimEnd(' ');
  264.                 s = br.ReadSingle();
  265.                 dom = br.ReadString();
  266.                 dom = dom.TrimEnd(' ');
  267.                 tel = br.ReadString();
  268.                 tel = tel.TrimEnd();
  269.                 emal = br.ReadString();
  270.                 emal = emal.TrimEnd(' ');
  271.  
  272.                 Console.Write("nn------------------------nClave: " + (i + 1));
  273.                 Console.Write("nNombre: " + n);
  274.                 Console.Write("nPuesto: " + p);
  275.                 Console.Write("nSueldo: {0:F2}", s);
  276.                 Console.Write("nDomicilio: " + dom);
  277.                 Console.Write("nTelefono: " + tel);
  278.                 Console.Write("nEmail: " + emal);
  279.             }
  280.  
  281.             Console.WriteLine("nnPresione <Enter> para Continuar...");
  282.             Console.ReadLine();
  283.             br.BaseStream.Seek(0, SeekOrigin.Begin);
  284.         }
  285.  
  286.         public void eliminaRegistro()
  287.         {
  288.             buscaRegistro();
  289.             Console.Write("nDesea elimiarlo? (S/N): ");
  290.             char op;
  291.  
  292.             do
  293.             {
  294.                 op = (char)Console.Read();
  295.                 op = Char.ToUpper(op);
  296.             }
  297.  
  298.             while (op != 'N' && op != 'S');
  299.  
  300.             if (op == 'S')
  301.             {
  302.                 n = "Registro Eliminado";
  303.                 n = n.PadRight(50);
  304.                 p = "Registro Eliminado";
  305.                 p = p.PadRight(50);
  306.                 s = 0;
  307.                 Empleado e = new Empleado(n, p, s, dom, tel, emal);
  308.                 escribeRegistro(c, e);
  309.             }
  310.         }
  311.     }
  312.  
  313.     public class Principal
  314.     {
  315.         static ArchivoEmpleados arEmp;
  316.  
  317.         public static char menu()
  318.         {
  319.             Console.Clear();
  320.             Console.WriteLine("A.- Agregar. ");
  321.             Console.WriteLine("B.- Buscar. ");
  322.             Console.WriteLine("C.- Cambiar. ");
  323.             Console.WriteLine("D.- Desplegar. ");
  324.             Console.WriteLine("E.- Eliminar. ");
  325.             Console.WriteLine("S.- Salir. ");
  326.             Console.Write("nOpcion: ");
  327.  
  328.             char op;
  329.             op = (char)Console.Read();
  330.             op = Char.ToUpper(op);
  331.  
  332.             Console.WriteLine(); Console.ReadLine();
  333.             return op;
  334.         }
  335.  
  336.         public static void Main(string[] args)
  337.         {
  338.             string archivo = "Empleados.dat";
  339.             arEmp = new ArchivoEmpleados(archivo);
  340.             char opcion;
  341.  
  342.             do
  343.             {
  344.                 opcion = menu();
  345.                 opcion = Char.ToUpper(opcion);
  346.  
  347.                 switch (opcion)
  348.                 {
  349.  
  350.                     case 'A':
  351.                         {
  352.                             arEmp.anadeRegistro(new Empleado(arEmp.n, arEmp.p, arEmp.s, arEmp.dom, arEmp.tel, arEmp.emal));
  353.                         }
  354.                         break;
  355.  
  356.                     case 'B':
  357.                         { arEmp.buscaRegistro(); }
  358.                         break;
  359.  
  360.                     case 'C':
  361.                         { arEmp.cambiaRegistro(); }
  362.                         break;
  363.  
  364.                     case 'D':
  365.                         { arEmp.desplieguaRegistros(); }
  366.                         break;
  367.  
  368.                     case 'E':
  369.                         { arEmp.eliminaRegistro(); }
  370.                         break;
  371.  
  372.                     case 'S':
  373.                         {
  374.                             arEmp.cierraArchivo();
  375.                             Console.Clear();
  376.                             Console.WriteLine("Fin del Programa!!!");
  377.                             Console.WriteLine("nPresione <Enter> para Salir..");
  378.                             Console.ReadLine();
  379.                         }
  380.  
  381.                         break;
  382.  
  383.                     default:
  384.                         {
  385.                             Console.WriteLine("Opcion no valida! Presione <Enter> para continuar..");
  386.                             Console.ReadKey();
  387.                         }
  388.                         break;
  389.                 }
  390.             }
  391.  
  392.             while (opcion != 'S');
  393.         }
  394.     }
  395. }
  396.  
  397.  
  398.  
  399.  
  400.  
  401.