PDA

Ver la Versión Completa : Escribir en un texto desde cierta posición


kirios
23-03-2012, 22:20:41
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 (http://www.delphibasics.co.uk/RTL.asp?Name=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
Si el archivo no es demasiado grande podrías leerlo en un TStringList (http://www.delphibasics.co.uk/RTL.asp?Name=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
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:

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
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:

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.

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:

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:

NumerarLineas('C:\ARCHIVO.TXT');


Ahora vamos a hacer lo mismo del modo que te sugiere roman:

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
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:

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:

NumerarLineas('C:\ARCHIVO.TXT');


Ahora vamos a hacer lo mismo del modo que te sugiere roman:

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!!