Pascal/Turbo Pascal - Ayuda con archivos!!

 
Vista:

Ayuda con archivos!!

Publicado por Maxi (20 intervenciones) el 10/11/2013 22:28:02
Hola, mi problema es el siguiente. Dispongo de dos archivos, uno para generar un arbol y otro para generar una lista. Luego de generados el arbol y la lista, puedo realizar acciones sobre la lista o el arbol, como por ejemplo borrar un nodo. Y luego al finalizar el programa debo regenerar desde cero los archivos con los datos de la lista en uno y los del arbol en otro. Mi problema es que cuando termino la ejecucion del programa (compila y ejecuta perfectamente), al volver a iniciarlo con los archivos modificados me da un error. Alguien me puede dar una mano? O la explicacion De como usar {$I-} y {$I+} ?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con archivos!!

Publicado por ramon (2158 intervenciones) el 10/11/2013 23:24:22
Uso de $I en archivos:
Si necesitas mas aclaración pídela,

var
f : file of elregistro que sea

1
2
3
4
5
6
7
8
9
10
assign(f,'aqui el nombre');
  {$I-} reset(f); {$I+}
  if ioresult <> 0 then
  begin
     Aqui se marca el error
  end
 else
    begin
      Aqui todo bien sige el proceso
    end;

Mira esto :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
procedure guardaarchi1(nom : string);
     begin
         assign(f,nom);
      {$I-} reset(f); {$I+}
      if ioresult <> 0 then
      begin
         rewrite(f);
         seek(f,0);
         write(f,datos a guardar);
         close(f);
      end
    else
       begin
         seek(f,filesize(f));
         write(f,datos a guardar);
         close(f);
       end;
     end;
 
    procedure cargaarchivo1(nom : string);
    var
      lon : longint;
      cont : integer;
    begin
       assign(f,nom);
      {$I-} reset(f); {$I+}
      if ioresult <> 0 then
      begin
         writeln('???? Error El Archivo No Encontrado Pulse Una Tecla ????');
         readkey;
         exit;
      end
    else
      begin
          lon := 0;
          cont := 1;
        repeat
            seek(f,lon);
            read(f,datos guardados);
            writeln(presentamos los datos cargados);
            lon := lon + 1;
            cont := cont + 1;
            if cont > 24 then
            begin
               writeln('*** Pulse Una Tecla ***');
               readkey;
               clrscr;
               cont := 1;
            end;
        until lon > filesize(f) - 1;
        writeln('**** Fin De Datos Pulse Una Tecla ****');
        readkey;
      end;
    end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con archivos!!

Publicado por Maxi (20 intervenciones) el 10/11/2013 23:36:26
Muchas gracias, pero me sigue pasando el mismo problema. Te describo por arriba... Tengo dos archivos ya cargados, con esos datos que contienen creo una lista y un arbol. El problema es cuando cierro el programa y lo vuelvo a abrir, ya que al finaliza regenera los archivos... Cuando agrego nodos o hago cambios entre nodos no me produce problemas, el problema es cuando borro un nodo que cuando vuelvo a ejecutar el programa (con los archivos modificados) me tira el error, podría deberse a que el error este en la eliminación del nodo? O es problema de los archivos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con archivos!!

Publicado por ramon (2158 intervenciones) el 11/11/2013 00:10:51
puedes pasar las estructuras de los punteros y la del árbol,
para mejor entender tu problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con archivos!!

Publicado por Maxi (20 intervenciones) el 11/11/2013 01:04:19
Ya encontre el error, es en el borrado de la lista... Es una lista doblemente vinculada y tiene dos punteros a un arbol, la lista que sale del nodo de esta lista la borro y el problema lo tengo en la eliminación. Te paso el procedimiento a ver si me podes dar una mano.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
procedure BorrarMsjes (var Msje: PListaM);
// Borra todos los mensajes de una conversación
var	Eliminar: PListaM;
begin
	While (Msje <> nil) do
		begin
			New (Eliminar);
			Eliminar:= Msje;
			Msje:= Msje^.sig;
			Dispose (Eliminar);
		end;
	Msje:= nil;
end;
 
procedure BorrarConver (var ListaC: PListaC; Nick: Key);
// Borra todas las conversaciones en las que participó el usuario
var Eliminar, PuntC: PListaC;
begin
	If (ListaC <> nil) then
		begin
			If ((ListaC^.User1^.Nick = Nick) or (ListaC^.User2^.Nick = Nick)) then
				begin
					New (Eliminar);
					BorrarMsjes (ListaC^.Mensaje);
					Eliminar:= ListaC;
					ListaC:= ListaC^.sig;
					Dispose (Eliminar);
				end
			else
				begin
					PuntC:= ListaC^.sig;
					While (PuntC <> nil) do
						begin
							If ((PuntC^.User1^.Nick = Nick) or (PuntC^.User2^.Nick = Nick)) then
								begin
									New (Eliminar);
									BorrarMsjes (PuntC^.Mensaje);
									Eliminar:= PuntC;
									PuntC:= PuntC^.sig;
									Dispose (Eliminar);
								end
							else
								PuntC:= PuntC^.sig;
						end;
				end;
		end;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con archivos!!

Publicado por ramon (2158 intervenciones) el 11/11/2013 12:25:35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
procedure BorrarMsjes(var Msje: PListaM);
  {Borra todos los mensajes de una conversación}
  var
     Eliminar : PListaM;
   begin
	While (Msje <> nil) do
	begin
	  New (Eliminar);
	  Eliminar := Msje;
	  Msje := Msje^.sig;
	  Dispose (Eliminar);
	end;
	Msje:= nil;
    end;
 
   procedure BorrarConver (var ListaC: PListaC; Nick: Key);
    {Borra todas las conversaciones en las que participó el usuario}
   var
   Eliminar, PuntC: PListaC;
   begin
     If (ListaC <> nil) then
     begin
      If ((ListaC^.User1^.Nick = Nick) or (ListaC^.User2^.Nick = Nick)) then
      begin
        New (Eliminar);
	BorrarMsjes (ListaC^.Mensaje);
	Eliminar:= ListaC;
	ListaC:= ListaC^.sig;
	Dispose (Eliminar);
      end
   else
      begin
        PuntC := ListaC^.sig;
	While (PuntC <> nil) do
	begin
	If ((PuntC^.User1^.Nick = Nick) or (PuntC^.User2^.Nick = Nick)) then
	begin
	  New(Eliminar);
	  BorrarMsjes(PuntC^.Mensaje);
	  Eliminar := PuntC;
	  PuntC := PuntC^.sig;
	  Dispose(Eliminar);
	  end
	else
	  PuntC:= PuntC^.sig;
      end;
   end;
  end;
 end;

puntero1 puntero2 puntero3 puntero4
cuando eliminas un puntero tienes que a ver enlazado
su puntero anterior al posterior o sea eliminamos el
puntero2 tenemos que a ver enlazado el puntero1 con
el puntero3 para no perder el enlaze tu veo que borras
pero no enlazas deverias de tener un puntero segidor
que te marque el enlace esto seria.
anterior, actual : loque sea
sal : boolean;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sal := false;
    anterior := nil;
    while (actual^.loquesea <> nil) and (sal <> true) do
    begin
    if actual^.loquesea = loquesea then
    sal := true
  else
    anterior := actual;
    actual := actual^.sigiente;
   end;
   if sal = true then
   begin
      anterior^.sigiente := actual^.sigiente;
      actual := nil;
   end;
esto pone la union de puntero1 a puntero3 y anula la conesion
de puntero2 si presentas los punteros veras que el dato borrado
no aparece.
espero esto te ayude puesto que a falta de datos no puedo acer mas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar