PDA

Ver la Versión Completa : fichero en delphi


luna
23-05-2004, 14:16:49
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:

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 ;))

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.


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
... cómo se renombra un fichero??
Mírate la función RenameFile

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