Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   fichero en delphi (https://www.clubdelphi.com/foros/showthread.php?t=10582)

luna 23-05-2004 14:16:49

fichero en delphi
 
Hola a tod@s!

Estoy utilizando un fichero con tipo, de registros ,(file of tregistros)
y quiero abrirlo para escribir al final, append no puedo utilizarlo xq es para ficheros de texto y abriendo con Reset o Rewrite me sobreescribe lo que ya tenía, existe algun otro comando equivalente a append para ficheros tipados?

gracias por adelantado

Julià T. 23-05-2004 14:50:21

después del Reset(F) puedes hacer:
seek(F,filesize(F));

luna 23-05-2004 16:50:40

Hola:

Gracias por lo de antes, me ha funcionado. Ahora tengo otra duda, estoy intentando borrar uno de los registros del fichero tipado para ello paso todo el fichero menos la línea que quiero borrar a un auxiliar y luego lo vuelvo a copiar al principal, debido a que creo que no hay un comando para ello. Pero no me funciona. Aquí te adjunto el código que utilizo:
Código Delphi [-]
 
  num:=0;  //xq el fichero empiza en 0
    AssignFile (faux, 'seguridad.dat');
    //Abrimos el auxiliar xa escritura
    rewrite (faux);
    encontrado:=false;
//Abrimos el fichero para lectura y comprobamos si los datos coinciden.
 Reset(fichero);
 while Eof(fichero) = False do
    begin
    read (fichero,ficha);
    num:=num+1; //me dira las posicion dentro del fichero de la linea
 q kiero borrar
    with ficha do
      begin
        if username= nombre_baja.Text then
           if pass= password_baja.Text then
              begin
                 encontrado:=true;
                 if username= 'carmen' then
                   MessageDlg ('Permiso denegado',mtError, [mbOK],0)
                   else  //Lo podemos borrar
                    begin
                       {num-1 es la linea anterior a lo q keremos borrar}
                       for i:=0 to num-2  do
                          begin
                             read (fichero, ficha);
                             write (faux, ficha);
                          end;
                          seek (fichero, num);
                             //se coloca dentro del fichero en la posicion 
                            donde está la linea q keremos borrar
                          {num+1 eslinea posterior a lo q keremos borrar}
                       for i:=num  to filesize (fichero) do
                          begin
                             read (fichero, ficha);
                             write (faux, ficha);
                          end;
                       rewrite (fichero); //Abrimos fichero xa escritura
                       reset (faux); //Abre faux para lectura
                       While NOT EOF (faux) do
                          begin
                             read (faux, ficha);
                             write (fichero, ficha);
                          end;
                       erase (faux);
                    end;
              end;
      end;
 end;
  CloseFile(fichero);
Gracias por adelantado!!

__cadetill 23-05-2004 17:21:46

Hola luna

No entiendo porque tanto bucle :confused:
Es más fácil que eso (creo). Como tu bien dices, no se puede borrar un "registro", ha de copiarse en un fichero temporal......

(lo pongo es pseudocódigo, supongo que será fácil pasarlo ;))
Código Delphi [-]
begin
  AbroFicheroTemporalPaEscritura;
  AbroFicheroOriginalPaLectura;
  while not Eof(Original) do
  begin
    LeoDelOriginal( Tmp );
    if Tmp <> RegistroAComprobar then
      AñadoEnFicheroTempral
    else
      if not PuedoBorrar then
        AñadoEnFicheroTempral;
  end;

  RenombroFicheroOriginalACopiaSeguridad;
  RenombroFicheroTemporalAOriginal;
end;
Más fácil, no?

PD: pobre Carmen, la tienes discriminada :D :D

luna 23-05-2004 17:50:12

Hola de nuevo!!
Muchas gracias por lo de antes, sí es verdad que es más sencillo:) pero, cómo se renombra un fichero?? Hace falta que copie el auxiliar al original??
PD: Carmen es la administradora, no está discriminada! jeje:D :D

Julià T. 23-05-2004 17:54:58

si no es un fichero ordenado, puede intercambiar el registro a borrar por el último y truncar el fichero.

Código Delphi [-]
procedure BorrarPosicion(N:integer);
Var
 f:file of TipoDelFichero;
 temp:TipoDelFichero;
begin
 //abrir fichero
 seek(F,UltimaPosicion);
 Read(F,Temp);
 seek(F,N);
 Write(F,Temp);
 seek(f,UltimaPosicion);
 truncate(F);
 //cerrar fichero
end;

__cadetill 23-05-2004 17:56:57

Cita:

Empezado por luna
... cómo se renombra un fichero??

Mírate la función RenameFile

Cita:

Empezado por luna
Hace falta que copie el auxiliar al original??

De hecho no, es sólo por medida de seguridad. No creo que el mantener un archivo más suponga mucho gaste de HD y, mira, te aeguras. No se, quizás son manías mias :D


La franja horaria es GMT +2. Ahora son las 20:09:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi