示例#1
0
 public void LeerCubeta(long dir, Cubeta C)
 {
     using (fs = new FileStream(path + nombre, FileMode.Open, FileAccess.Read))
     {
         C.Direccion = dir;
         fs.Seek(dir, SeekOrigin.Begin);
         byte[] bytes = new byte[sizeof(int)];
         fs.Read(bytes, 0, sizeof(int));
         int NoRegistros = BitConverter.ToInt32(bytes, 0);
         bytes = new byte[sizeof(long)];
         fs.Read(bytes, 0, sizeof(long));
         C.DirSigCubeta = BitConverter.ToInt64(bytes, 0);
         for (int i = 0; i < NoRegistros; i++)
         {
             bytes = new byte[sizeof(int)];
             fs.Read(bytes, 0, sizeof(int));
             int clave = BitConverter.ToInt32(bytes, 0);
             bytes = new byte[sizeof(int)];
             fs.Read(bytes, 0, sizeof(int));
             int a = BitConverter.ToInt32(bytes, 0);
             bytes = new byte[sizeof(long)];
             fs.Read(bytes, 0, sizeof(long));
             long d = BitConverter.ToInt64(bytes, 0);
             bytes = new byte[10];
             fs.Read(bytes, 0, 10);
             string s = Encoding.ASCII.GetString(bytes, 0, bytes.Length).TrimEnd('\0');
             C.Insertar(new CRegistro(clave, a, d, s));
         }
     }
 }
示例#2
0
        public void InsertaRegistro(CRegistro registro)
        {
            Cubeta  C        = new Cubeta(noRegistros);
            Archivo archivo  = new Archivo(nombre, path);
            int     posicion = tabla.Hash(registro.Clave);
            long    dirC     = tabla.Cajones[posicion];

            if (dirC == -1)
            {
                dirC = tabla.PtrsCubetaVacia;
                if (dirC != -1)
                {
                    archivo.LeerCubeta(dirC, C);
                    tabla.PtrsCubetaVacia = C.DirSigCubeta;
                    C.DirSigCubeta        = -1;
                }

                C.Insertar(registro);
                C.Direccion = tabla.Cajones[posicion] = archivo.EscribirCubeta(C);
                archivo.EscribirTablaH(tabla);
            }
            else
            {
                long ant;
                dirC = tabla.Cajones[posicion];
                do
                {
                    C = new Cubeta(noRegistros);
                    archivo.LeerCubeta(dirC, C);
                    ant  = dirC;
                    dirC = C.DirSigCubeta;
                } while (C.NoRegistros >= noRegistros && dirC != -1);

                if (C.NoRegistros < noRegistros)
                {
                    C.Insertar(registro);
                    C.Direccion = ant;
                    archivo.EscribirCubeta(C);
                }
                else
                {
                    Cubeta cc = new Cubeta(noRegistros);
                    if (tabla.PtrsCubetaVacia != -1)
                    {
                        archivo.LeerCubeta(tabla.PtrsCubetaVacia, cc);
                        tabla.PtrsCubetaVacia = cc.DirSigCubeta;
                        cc.DirSigCubeta       = -1;
                    }

                    cc.Insertar(registro);
                    C.Direccion    = ant;
                    C.DirSigCubeta = cc.Direccion = archivo.EscribirCubeta(cc);
                    archivo.EscribirCubeta(C);
                }
                // archivo.LeerCubeta(dirC, C);
                // C.InsertaRegistro(registro);
            }
        }