[ Foro de Pascal ]
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;
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.
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 (<>) ??
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.
Debes colocar "distinto", lo corregí pero no me aceptó la corrección. Disculpa.
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.
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.
¿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.
Yo utilizo Dev-Pascal. Bueno pues si es mejor cerrar primero pues esta hecho.
Gracias por la ayuda.
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.
Ok, gracias por la informacion. Pero yo lo dejare asi (primero cierro y luego cambio nombre) porque asi me funciona bien.
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.
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.)