[ Foro de Pascal ]

Borrar fichero

15-Jan-2013 20:09
Antonio Rodrigues
12 Respuestas

Este es el enunciado de mi problema:

"Codifique un procedimiento que elimine los elementos de una cesta que ya ha sido entregada, eliminando el nombre del pedido del fichero indice.txt."

Este es el codigo que tengo:

procedure pedido_entregado(var mi_cesta: cesta; var Nfichero: string);
         var
            i: integer;
            fichero: text;
            linea: string;
            exito: boolean;

         begin
              for i:=1 to tamxcesta do
                  mi_cesta[i].en_cesta:= false;

              exito:= false;

              assign(fichero, 'indice.txt');
              {$I-}
              reset(fichero);
              {$I+}

              if (ioResult=0) then
                 begin
                      while not eof(fichero) do
                            begin
                                 readln(fichero, linea);

                                 if (linea=Nfichero) then
                                    exito:= true;
                            end;

                      if (exito=true) then

                 end
              else
                  writeln('Lo siento, pero aun no se ha realizado ningun pedido.');

              close(fichero);
         end;

Mis problemas son:

1º: En esta parte:

for i:=1 to tamxcesta do
                  mi_cesta[i].en_cesta:= false;

Lo que hago es poner el campo en_cesta a false. Haciendo esto lo que pasa es que los productos dejan de estar en la cesta. Pero yo tambien quiero eliminar la cesta del fichero.
Es decir, yo he guardado los productos en la cesta, luego esa cesta la he guardado en un fichero con el nombre micesta.dat.
Yo lo que quiero es eliminar los productos de la cesta (eso ya lo hago con el for anterior), pero tambien quiero eliminar la cesta que esta guardada en el fichero.

Alguna idea de como puedo hacer eso ??

2º: Mi segundo problema esta aqui:

exito:= false;

              assign(fichero, 'indice.txt');
              {$I-}
              reset(fichero);
              {$I+}

              if (ioResult=0) then
                 begin
                      while not eof(fichero) do
                            begin
                                 readln(fichero, linea);

                                 if (linea=Nfichero) then
                                    exito:= true;
                            end;

                      if (exito=true) then

                 end
              else
                  writeln('Lo siento, pero aun no se ha realizado ningun pedido.');

              close(fichero);

Luego, el ejercicio pide que elimine el nombre de la cesta (la cesta que dije que tengo que eliminar antes) del fichero indice.txt. Lo que hago es, primero voy leyendo el fichero indice.txt linea a linea hasta encontrar el nombre de la cesta que quiero eliminar (el nombre de la cesta es micesta.dat, pero aqui lo pongo como Nfichero ya sabeis porque). Luego, cuando encuentro el nombre, lo hago aqui:

while not eof(fichero) do
                            begin
                                 readln(fichero, linea);

                                 if (linea=Nfichero) then
                                    exito:= true;
                            end;

                      if (exito=true) then

Se supone que aqui ya ye encontrado el nombre y lo que tengo que hacer es borrar ese nombre del fichero indice.txt. El problema es que no se que poner (no se que comando poner) para borrar el nombre.
Alguien me dice que tengo que poner ??

P.S: Aqui dejo como es la cesta y el fichero del 1º problema por si lo necesitais.

type
   producto = record
            nombre: string;
            num_unidades: integer;
            precio_unidad: real;
            en_cesta: boolean;
   end;

   cesta=array[0..tamxcesta] of producto;

   Tfichero=file of producto;


15-Jan-2013 22:09
Luis Torres (+18)

Para eliminar el archivo que contiene la cesta, lo que debes hacer es lo siguiente:


assign(archivo,'C:\cesta1.dat');
erase(archivo);


Esto elimina el archivo cesta1.dat, el cual está en el directorio raíz C.

Para eliminar la línea que contiene el nombre la cesta en el archivo de texto "indice.txt", debes hacer algo como esto:


program borrarLineaArchivo;
var
 archivo, archivo_aux: text;
 cad, linea: string;

BEGIN
 assign(archivo,'C:\indice.txt');
 assign(archivo_aux,'C:\borrar.txt');
 reset(archivo);
 rewrite(archivo_aux);
 write('Introduzca el nombre de la cesta a elimnar: '); readln(cad);
 while not eof(archivo) do
  begin
    readln(archivo,linea);
    if linea<>cad then
     writeln(archivo_aux,linea);
  end;
 close(archivo);
 erase(archivo);
 rename(archivo_aux,'C:\indice.txt');
 close(archivo_aux);
 readln;
END.



Trata de adpatar este último código a tu programa. Es básicamente lo mismo.

Saludos.


15-Jan-2013 23:36
Antonio Rodrigues

Ok, entiendo. Pero tengo una duda.  Aqui:

if lineacad then

que se supone que pongo en el medio de linea y cad ??
Pongo igual (=) o distinto (<>) ??


15-Jan-2013 23:46
Antonio Rodrigues

Hay otra cosa que falla. Se supone que despues de eliminar el fichero indice.txt, el fichero borrar.txt el auxliar se sustituye su nombre por indice.txt.
Pero cuando ejecuto mi programa, el nombre no se sustituye y no se porque.


16-Jan-2013 01:51
Luis Torres (+18)

Debes colocar "distinto", lo corregí pero no me aceptó la corrección. Disculpa.


16-Jan-2013 01:54
Luis Torres (+18)

Yo lo corrí y me funciona bien. Al principio no lo hacía porque yo tengo los archivos en el directorio raíz (unidad C); pero al especificar la ruta se solucionó el problema.
Si tienes los archivos de las cestas y el indice.txt en el mismo directorio donde tienes el fuente, elimina la parte donde dice C:\
Saludos.


16-Jan-2013 14:59
Antonio Rodrigues

Bueno, he encontrado la solucion al problema.
Lo que pasa es que la solucion que me has dado, primero pones para cambiar el nombre del fichero auxiliar (rename(archivo_aux,'C:\indice.txt');) y solo despues cierras el fichero (close(archivo_aux);).

Pues yo lo he hecho al rever.
Primero cierro el fichero (close(archivo_aux);) y despues cambio el nombre (rename(archivo_aux,'C:\indice.txt');).
De esta forma funciona todo bien y no me da ni problemas ni errores.


16-Jan-2013 16:04
Luis Torres (+18)

¿Qué compilador utilizas tú?.
Ok, está bien, tiene lógica lo que tú haces. Es verdad, es mejor cerrar los archivos antes de eliminarlos o renombrarlos. Lo tendré en cuenta.
Saludos.


16-Jan-2013 22:29
Antonio Rodrigues

Yo utilizo Dev-Pascal. Bueno pues si es mejor cerrar primero pues esta hecho.
Gracias por la ayuda.


17-Jan-2013 02:36
Luis Torres (+18)

Acabo de leer un tutorial sobre el manejo de archivos en turbo pascal y allí dice que no es necesario cerrar el archivo para renombrarlo. En cambio sí es necesario cerrar el archivo para eliminarlo.
Saludos.


17-Jan-2013 03:02
Antonio Rodrigues

Ok, gracias por la informacion. Pero yo lo dejare asi (primero cierro y luego cambio nombre) porque asi me funciona bien.


17-Jan-2013 16:55
Luis Torres (+18)

Seguí leyendo tutoriales y en otros afirman que hay que cerrar el archivo para renombrarlo. Obviamente hay compiladores en los que puedes renombrar sin cerrarlos y en otros es obligatorio cerrarlos.
Saludos.


18-Jan-2013 01:58
Antonio Rodrigues

Tendre eso en cuenta por si algun dia utilizo un compilador diferente. Una ves mas gracias.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)