• Viernes 29 de Marzo de 2024, 08:09

Autor Tema:  Escribir En Texto  (Leído 2699 veces)

pere

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Escribir En Texto
« en: Miércoles 13 de Diciembre de 2006, 22:16 »
0
O mejor dicho en un texto.
Ante todo muy buenas y deciros que aunque escribo poco en el foro no he dejado de darle caña para a ver si aprendo algo de programación y tengo una duda (bueno tengo muchas pero esta es una de ellas).
A ver escribir algo en un txt ya se hacerlo pero hacer que lo escriba siempre en el mismo sito y reescribiendo lo que había escrito, se puede hacer?
Porfa darme unas pistillas que ando bastante perdido.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Escribir En Texto
« Respuesta #1 en: Jueves 14 de Diciembre de 2006, 05:14 »
0
Definir una variable de tipo texto:
Código: Text
  1.  
  2. var
  3.    F: TEXT;
  4.  
  5.  
Asignar un archivo a esa variable
Código: Text
  1.  
  2. Assign(F, 'C:\NombreArchivo.txt');
  3.  
  4.  

Aca surgen 2 posibilidades,
A)Que el archivo no exista, entonces debemos crearlo
Código: Text
  1.  
  2. ReWrite(F);
  3.  
  4.  
B)Que exista, entonces tenemos otras 2 subposibilidades mas:
B1)Borrarlo todo y  prepararlo para escribir nuevamente
Código: Text
  1.  
  2. ReWrite(F);
  3.  
  4.  
B2)Prepararlo para escribir al final del archivo sin borrar lo anterior
Código: Text
  1.  
  2. Append(F);
  3.  
  4.  

Siempre es importante cerrarlo para guardar algunos cambios
Código: Text
  1.  
  2. Close(F);
  3.  
  4.  

Supongo que eso seria todo, cualquier duda, no esperes para preguntar.
Saludos

pere

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Escribir En Texto
« Respuesta #2 en: Jueves 14 de Diciembre de 2006, 09:54 »
0
gracias enko por la respuesta, lo que pasa es que si utilizo rewrite se borrará todo el archivo no? y eso no me interesa, lo que quiero es poder cambiar valor en una determinada situación dentro del txt por ejemplo:

goles de drogba 4

y si yo quiero que solo cambie el (4) por el valor que yo le ponga? como lo tengo que hacer?
Estoy intentando utilizar el goto (x,y) con el read pero al utilizarlo me lee todo el archivo y me posiciona el cursor en la posiciión (x,y)....
Ahora estoy en el trabajo y no me acuerdo muy bien como lo hice, esta tarde seguiré. Lo que si que se es que lo hago con un registro y de momento solo tengo un jugador, pero quiero ponerle el equipo entero y poder ir sumandole los goles a medida que vayamos marcando goles (supongo que tendré que utilizar arrays de registro :scream: .
venga un saludo.

-DriverOp-

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Escribir En Texto
« Respuesta #3 en: Jueves 14 de Diciembre de 2006, 10:22 »
0
Respondo a tu primer post:
No es posible hacer eso tal como tú lo planteas ya que un archivo de texto no tiene ningún índice por el cual el SO pueda desplazarse hacia atrás, los únicos marcadores que hay son fin de línea o fin de archivo y estos pueden caer en cualquier parte del archivo.

Una posible solución para esto sería, copiar el archivo entero (eso es fácil) en un temporal, leer secuencialmente línea por línea ese archivo, buscar en el string de lectura la cadena que te interesa, cambiar lo que se necesite, y luego ir sobreescribiendo el archivo original.

Respondo a tu segundo post:
Tal como lo planteas ahora, no necesitas hacerlo con archivos de texto, de hecho es múcho más fácil hacerlo con archivos de registros. Intuyo que la estructura del mismo, según lo que has comentado sería:

Código: Text
  1. type
  2. TRegistro=record
  3.   Nombre: string[20];
  4.   Goles: integer;
  5. end;
  6.  
  7. TArch=file of TRegistro;
  8.  
  9. var
  10.   Arch: TArch;
  11.   Reg: TRegistro;
  12.  

Usando un archivo con tipo, como lo he declarado más arriba, sí es posible desplazarse aleatoriamente. Para ello existe el procedimiento Seek().

pere

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Escribir En Texto
« Respuesta #4 en: Jueves 14 de Diciembre de 2006, 10:41 »
0
gracias driverop lo probaré en cuanto llegue y si no me sale ya volveré a postear.

Por cierto me recomendais algún libro de turbo pascal que sea para pardillos como yo?

pere

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Escribir En Texto
« Respuesta #5 en: Jueves 14 de Diciembre de 2006, 21:08 »
0
JE JE JE supongo que no hay ninguno para pardillos y con el que tengo no me entero demasiado, por eso:
-Podríais ponerme un ejemplo claro de como utilizar el procedimiento seek() ? a ver si me entero....
-Dices que con el procedimiento seek puedes desplazarte  aleatoriamente, y una vez posicionado, de que manera realizo la lectura del valor de  este registro para yo poder hacer las operaciones que sean necesarias?

No se si me explico con claridad disculpen las molestias.

-DriverOp-

  • Miembro activo
  • **
  • Mensajes: 81
    • Ver Perfil
Re: Escribir En Texto
« Respuesta #6 en: Viernes 15 de Diciembre de 2006, 01:54 »
0
Hola pere.

  El mejor libro de TP7 que he leído es el de Joyanes, no por nada es un clásico dentro del mundo Pascal en habla española.
http://www.agapea.com/Programacion-en-Pascal-n313327i.htm

Citar
-Podríais ponerme un ejemplo claro de como utilizar el procedimiento seek() ? a ver si me entero....
Seguro!, aquí está:
Suponiendo que el nombre lógico del archivo es Arch.
Código: Text
  1.  
  2.  
  3. { ir al quinto registro }
  4. Seek(Arch,4);
  5. Read(Arch, Reg);
  6.  
  7.  
El órden lógico de registros comienza en cero.

Código: Text
  1.  
  2. { ir al primer registro }
  3. Seek(Arch,0);
  4. Read(Arch,Reg);
  5.  
  6.  

Código: Text
  1.  
  2. { ir al último registro }
  3. Seek(Arch, FileSize(Arch)-1);
  4. Read(Arch,Reg);
  5.  
  6.  
FileSize devuelve el número de registros en el archivo teniendo en cuenta que si el archivo tiene un solo registro, es decir, el registro número cero, FileSize en ese caso devuelve 1, si le pasas como parámetro a Seek lo que devuelve FileSize() te irás a la posición siguiente al último registro, menos uno, estarás parado listo para leer el último registro.

Ahora bien, si quieres agregar un registro al archivo puedes aprovechar FileSize así:
Código: Text
  1.  
  2. { agrega un registro al final }
  3. Seek(Arch,FileSize(Arch));
  4. Write(Arch,Reg);
  5.  
  6.  
Como decía, el segundo parámetro de Seek() es la posición lógica del registro en el que se para. Si quieres saber en qué posición estás puedes usar la función FilePos(Arch); que devuelve un tipo Longint:
Código: Text
  1.  
  2. Seek(Arch,10);
  3. writeln('El puntero del archivo apunta al registro número: ',FilePos(Arch));
  4.  
  5.  

Recuerda además que Read() lee el registro actual y luego avanza el puntero, de forma tal que:
Código: Text
  1.  
  2. Seek(Arch,10);
  3. writeln('El puntero del archivo apunta al registro número: ',FilePos(Arch));
  4. Read(Arch,Reg);
  5. writeln('Ahora el puntero del archivo apunta al registro número: ',FilePos(Arch));
  6.  
  7.  

Lo mismo pasa con Write(), escribe/sobreescribe en la posición actual y avanza el puntero.

No es molestia. Saludos.

pere

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Escribir En Texto
« Respuesta #7 en: Viernes 15 de Diciembre de 2006, 09:55 »
0
muchisimas gracias por la rocomendación del libro y gracias por la explicación que ahora si que me haquedado claro como tengo que hacerlo.
Bueno a medida que vaya añadiendo cosas al programa seguro que iré preguntando mas cosas, otra vez gracias.