Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Escribir en un texto desde cierta posición (https://www.clubdelphi.com/foros/showthread.php?t=78153)

kirios 23-03-2012 22:20:41

Escribir en un texto desde cierta posición
 
Hola, una duda rápida.

Tengo un archivo de texto, el cual abro para reescribir (Assignfile,rewrite,etc)

Necesitaria escribir un dato en cada linea, pero no desde el principio, sino desde mas adelante, por ejemplo, escribir un 4 en la posicion 20 de la primera linea; un 7 en la posicion 20 de la segunda linea, y asi.

Alguna idea?

Graciaass :D

roman 23-03-2012 22:23:16

Si el archivo no es demasiado grande podrías leerlo en un TStringList y así acceder a las líneas del archivo como si fuera un arreglo de cadenas.

// Saludos

kirios 23-03-2012 22:33:09

Cita:

Empezado por roman (Mensaje 428348)
Si el archivo no es demasiado grande podrías leerlo en un TStringList y así acceder a las líneas del archivo como si fuera un arreglo de cadenas.

// Saludos

Esta buena la idea, pero ya tengo casi todo el código armado, se me complica empezar a cambiarlo ahora. Necesito algo que me deje acceder a la posicion x de la primera linea y asi, que escriba a partir de esa posicion.

seria algo como un writeln(archivo, texto) pero a partir de una dada posicion.

Gracias!

ecfisa 23-03-2012 23:04:31

Cita:

Empezado por kirios (Mensaje 428347)
Hola, una duda rápida.

Tengo un archivo de texto, el cual abro para reescribir (Assignfile,rewrite,etc)

Necesitaria escribir un dato en cada linea, pero no desde el principio, sino desde mas adelante, por ejemplo, escribir un 4 en la posicion 20 de la primera linea; un 7 en la posicion 20 de la segunda linea, y asi.

No sé si entiendo bién lo que buscas, pero ajustandome lo que comentas arriba tendrías que poner tantos caracteres delante del dato como posicion desees que este.

A modo de ejemplo, para poner un asterisco en 40 líneas en las posiciónes 1 / 40 sucesivamente sería:
Código Delphi [-]
var
  Arch: TextFile;
  i: Integer;
  Dato: string;
begin
  AssignFile(Arch,'C:\ARCHIVO.TXT');
  Rewrite(Arch);
  Dato:= '*';
  for i:= 1 to 40 do
    Writeln(Arch, StringOfChar(' ', i) + Dato);
  CloseFile(Arch);
end;

Saludos.

Casimiro Notevi 23-03-2012 23:05:34

Y una vez abierto, ¿qué haces con él?

kirios 23-03-2012 23:14:42

Cita:

Empezado por ecfisa (Mensaje 428350)
No sé si entiendo bién lo que buscas, pero ajustandome lo que comentas arriba tendrías que poner tantos caracteres delante del dato como posicion desees que este.

A modo de ejemplo, para poner un asterisco en 40 líneas en las posiciónes 1 / 40 sucesivamente sería:
Código Delphi [-]
var
  Arch: TextFile;
  i: Integer;
  Dato: string;
begin
  AssignFile(Arch,'C:\ARCHIVO.TXT');
  Rewrite(Arch);
  Dato:= '*';
  for i:= 1 to 40 do
    Writeln(Arch, StringOfChar(' ', i) + Dato);
  CloseFile(Arch);
end;

Saludos.

Hola! Para verlo mas claro, estoy buscando la manera de escribir en un texto pero no alineado a la izquierda, sino en el centro, o en este caso, tantos caracteres mas a la derecha como yo quiera. Ej

Tengo el archivo siguiente:

ProductoA
ProductoB
ProductoC

Mi idea es hacer lo siguiente

ProductoA 4
ProductoB 2
productoC 5

ect. Los productos tienen diferentes longitudes y espacios. La idea es que los numeros que re-escribo queden alineados.

Gracias!

ecfisa 23-03-2012 23:39:21

Hola.
Cita:

Tengo el archivo siguiente:

ProductoA
ProductoB
ProductoC
Eso es lo que no entiendo, si en el archivo tenés datos, al hacer Rewrite estos se borrarán.

Saludos.

ecfisa 24-03-2012 00:34:15

Hola.

Me quedé pensando si lo que buscas no será modificar un archivo de texto existente y estás confundido con la funcionalidad del procedimiento Rewrite.

Al ser estos archivos de acceso secuencial sólamente te quedaría leer sobre el archivo origen, realizar los cambios, guardarlos en otro archivo destino y al finalizar, borrar el primero y renombrar el último como el primero.

Para darte una idea te pongo un ejemplo que numera cada línea de un archivo de texto:
Código Delphi [-]
procedure NumerarLineas(AName: string);
var
  Ori,Des: TextFile;
  Cont: Integer;
  TempName: string;
  Linea: string;
begin
  AssignFile(Ori, AName);
  AssignFile(Des, ExtractFileName(AName)+'@@@@'+ExtractFileExt(AName));
  Reset(Ori);
  Rewrite(Des);
  Cont:= 0;
  while not eof(Ori) do
  begin
    Readln(Ori, Linea);
    Insert(IntToStr(Cont)+ ') ', Linea, 1);
    Writeln(Des, Linea);
    Inc(Cont);
  end;
  CloseFile(Ori);
  CloseFile(Des);
  Erase(Ori);
  Rename(Des,AName);
end;
Llamada:
Código Delphi [-]
  NumerarLineas('C:\ARCHIVO.TXT');

Ahora vamos a hacer lo mismo del modo que te sugiere roman:
Código Delphi [-]
procedure NumerarLineas(AName: string);
var
  TS: TStrings;
  Cont: Integer;
  s: string;
begin
  TS:= TStringList.Create;
  try
   TS.LoadFromFile(Aname);
    for Cont:= 0 to TS.Count -1 do
    begin
      s:= TS[Cont];
      Insert(IntToStr(Cont+1)+')', s,  1);
      TS[Cont]:= s;
    end;
    TS.SaveToFile(AName);
  finally
    TS.Free;
  end;
end;
Mirá que sencillo ! ¿ Cuál es el inconveniente de hacerlo de esa forma ?, no tendrías que alterar tu código en absoluto.

Saludos.

kirios 24-03-2012 01:38:17

Cita:

Empezado por ecfisa (Mensaje 428355)
Hola.

Me quedé pensando si lo que buscas no será modificar un archivo de texto existente y estás confundido con la funcionalidad del procedimiento Rewrite.

Al ser estos archivos de acceso secuencial sólamente te quedaría leer sobre el archivo origen, realizar los cambios, guardarlos en otro archivo destino y al finalizar, borrar el primero y renombrar el último como el primero.

Para darte una idea te pongo un ejemplo que numera cada línea de un archivo de texto:
Código Delphi [-]
procedure NumerarLineas(AName: string);
var
  Ori,Des: TextFile;
  Cont: Integer;
  TempName: string;
  Linea: string;
begin
  AssignFile(Ori, AName);
  AssignFile(Des, ExtractFileName(AName)+'@@@@'+ExtractFileExt(AName));
  Reset(Ori);
  Rewrite(Des);
  Cont:= 0;
  while not eof(Ori) do
  begin
    Readln(Ori, Linea);
    Insert(IntToStr(Cont)+ ') ', Linea, 1);
    Writeln(Des, Linea);
    Inc(Cont);
  end;
  CloseFile(Ori);
  CloseFile(Des);
  Erase(Ori);
  Rename(Des,AName);
end;
Llamada:
Código Delphi [-]
  NumerarLineas('C:\ARCHIVO.TXT');

Ahora vamos a hacer lo mismo del modo que te sugiere roman:
Código Delphi [-]
procedure NumerarLineas(AName: string);
var
  TS: TStrings;
  Cont: Integer;
  s: string;
begin
  TS:= TStringList.Create;
  try
   TS.LoadFromFile(Aname);
    for Cont:= 0 to TS.Count -1 do
    begin
      s:= TS[Cont];
      Insert(IntToStr(Cont+1)+')', s,  1);
      TS[Cont]:= s;
    end;
    TS.SaveToFile(AName);
  finally
    TS.Free;
  end;
end;
Mirá que sencillo ! ¿ Cuál es el inconveniente de hacerlo de esa forma ?, no tendrías que alterar tu código en absoluto.

Saludos.

Hola! Si, me explique mal. En el archivo tengo datos, y lo que hago es copiarlos, modificarlos, y volver a escribirlos, pero con los numeros adelante, es como para iniciar un conteo de productos. Voy a probar esa solucion! Graciaaas!!


La franja horaria es GMT +2. Ahora son las 14:44:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi