Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2009-11

Como leer y escribir archivos de textos

15 messages · 5 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Ismael L. Donis García

Estoy tratando de leer y escribir un archivo de texto con TFileStream pero no he podido encontrar la forma:

La estructura ser�a m�s o menos as�:

[Datos]
conexion=1
seridor=192.168.0.1
puerto=3050
bd=D:\Datos\
..

[Otros]
recibido=Juan Carlos
...

�sea el archivo debe estar clasificado en:

- Cabezas [Datos] ....
- Art�culos conexion ....
- Valores 1 ....

GRACIAS por la ayuda que me puedan brindar.
=========
�� ISMAEL ��
=========
PD: Eso lo tengo en una clase en VB6 pero estoy trabado en su conversi�n. Si quieren ver lo que tengo en VB no tengo inconveniente en pasarlo a la lista. ------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20091117/3f4e6619/attachment.html>

Reply by email

JoshyFun
to Ismael L. Donis García

Hello Ismael,

Tuesday, November 17, 2009, 10:31:52 PM, you wrote:

ILDG> Estoy tratando de leer y escribir un archivo de texto con ILDG> TFileStream pero no he podido encontrar la forma: ILDG> La estructura ser�a m�s o menos as�:

ILDG> [Datos]
ILDG> conexion=1
ILDG> seridor=192.168.0.1
ILDG> puerto=3050
ILDG> bd=D:\Datos\
[...]
ILDG> GRACIAS por la ayuda que me puedan brindar.

El archivo tiene toda la pinta de tener un formato .INI file, y para ello te ser�a m�s c�modo usar el TIniFile en vez de TFileStream. A�ade TIniFile al "uses" y ya dispones de TIniFile.

Best regards, JoshyFun

Reply by email

Fjbr.
to JoshyFun

Y si no es un .INI (aunque a simple vista lo parece)... siempre puedes cargarlo en un TStringList y recorrerlo linea a l�nea.

var
  sl: TStringList;
  i: Integer;
begin
  sl:= TStringList.Create;
  try
    // Cargamos todo el fichero
    sl.LoadFromFile('fichero_de_datos.ini');
    // Procesamos linea a linea
    for i:= 0 to sl.count -1 do
    begin
      Hacer_Algo_Con_Cada_Linea( sl[i] );
    end;
  finally
    sl.free;
  end;
end;

El 17 de noviembre de 2009 23:22, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 30 lines
Hello Ismael, Tuesday, November 17, 2009, 10:31:52 PM, you wrote: ILDG> Estoy tratando de leer y escribir un archivo de texto con ILDG> TFileStream pero no he podido encontrar la forma: ILDG> La estructura ser�a m�s o menos as�: ILDG> [Datos] ILDG> conexion=1 ILDG> seridor=192.168.0.1 ILDG> puerto=3050 ILDG> bd=D:\Datos\ [...] ILDG> GRACIAS por la ayuda que me puedan brindar. El archivo tiene toda la pinta de tener un formato .INI file, y para ello te ser�a m�s c�modo usar el TIniFile en vez de TFileStream. A�ade TIniFile al "uses" y ya dispones de TIniFile. -- Best regards, JoshyFun _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
------- Fjbr25. ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20091118/b1930518/attachment.html>

Reply by email

Claudio Romero
to Fjbr.

Como dice JoshyFun tiene pinta de una .INI, un ejemplo sencillo del mismo:

Agregas uses inifiles; arriba

procedure TForm1.Button1Click(Sender: TObject);
var ini:Tinifile;archivo:string;UltimaActualizacion:double;
	BaseDeDatos,Recibido:string;LogSolicitado:integer; usaZebedee:boolean;
begin
    archivo:=ExtractFilePath(Application.EXEName)+'archivo.ini';
    if not FileExists(archivo) then
    begin
        showmessage('ERROR:no se encuentra el archivo archivo.ini');
        exit;
   end;
   ini := TIniFile.Create(archivo);
    with ini do
    begin
        BaseDeDatos:=ReadString('Datos', 'BaseDeDatos','' );
        LogSolicitado:=ReadInteger('Datos','LogSolicitado',1);
        UltimaActualizacion:=ReadFloat('Datos', 'UltimaActualizacion',0 );
        usaZebedee:=ReadBool('Datos','UsaZebedee',false);
        Recibido:=ReadString('Otros', 'recibido','' );
        Free;
    end;
end;

Para escribir solo pones Write en vez de Read, con algun cambio en los parametros, pero es muy sencillo.
Saludos

Reply by email

Ismael L. Donis Garc?a
to JoshyFun: ILDG> Estoy tratando de leer y escribir un archivo de texto con ILDG> TFileStream pero no…

Si es precisamente es un archivo .ini, �sea un archivo de texto que le pongo .ini porque lo uso para configuraci�n general.

Muchas gracias ver� como se hace con TIniFile.

Hasta ahora estaba tratando de convertir lo que tengo de VB6 para hacer dicho trabajo, ya hab�a convertido 2 procedimientos, aunque todav�a no los he probado:

function Tdtmmp.headiniformated(head: string): string;
begin
  //Formatea un head para usarse
  head := trim(head);
  if leftstr(head, 1)  '[' then head := '[' + head;
  if rightstr(head, 1)  ']' then head := head + ']';
  result := head;
end;
procedure Tdtmmp.inicopyfile(fileini: string; numlinereem: integer;
  valuereem: string; reemplace: boolean);
  var
    inti: integer;
    strlinea, strfiledest: string;
    nexfileini: TextFile;
    oldfileini: TextFile;
begin
  //Vac�a un archivo ini al otro
  //numlinereem = N�mero de l�nea a reemplazar
  //valuereem = Valor por el que se reemplaza
  //reemplace = si es verdadero entonces se reemplaza la l�nea, si es falso
entonces se inserta la l�nea
  inti := 0;
  AssignFile (oldfileini, fileini);
  Append (oldfileini); // abre un archivo existente
  strfiledest := fileini + '2';
  AssignFile (nexfileini, strfiledest);
  Rewrite (nexfileini); // crear uno nuevo
  while not eof(oldfileini) do
    begin
      inti := inti + 1;
      readln(oldfileini, strlinea);
      if inti = numlinereem then
        begin
          writeln(nexfileini, valuereem);
          if not reemplace then writeln(nexfileini, strlinea);
        end
      else
        writeln(nexfileini, strlinea);
    end;
  if inti < numlinereem then //significa que estaba vac�o o que no exist�a
    writeln(nexfileini, valuereem);
  closefile(oldfileini);
  deletefile(fileini);
  rename(nexfileini, fileini);
  closefile(nexfileini);
end;

Saludos cordiales
=========
�� ISMAEL ��
=========

Earlier message 33 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: martes, 17 de noviembre de 2009 04:22 Asunto: Re: [Lazarus-es] Como leer y escribir archivos de textos Hello Ismael, Tuesday, November 17, 2009, 10:31:52 PM, you wrote: ILDG> Estoy tratando de leer y escribir un archivo de texto con ILDG> TFileStream pero no he podido encontrar la forma: ILDG> La estructura ser�a m�s o menos as�: ILDG> [Datos] ILDG> conexion=1 ILDG> seridor=192.168.0.1 ILDG> puerto=3050 ILDG> bd=D:\Datos\ [...] ILDG> GRACIAS por la ayuda que me puedan brindar. El archivo tiene toda la pinta de tener un formato .INI file, y para ello te ser�a m�s c�modo usar el TIniFile en vez de TFileStream. A�ade TIniFile al "uses" y ya dispones de TIniFile. -- Best regards, JoshyFun

Reply by email

Ismael L. Donis García
to Fjbr.: Y si no es un .INI (aunque a simple vista lo parece)... siempre puedes cargarlo en un…

Gracias, toda ayuda es bien venida ya que voy ganando en conocimientos.

Esta es otra v�a por donde mirar.

Saludos
=========
�� ISMAEL ��
=========

Earlier message 55 lines
----- Mensaje original ----- De: Fjbr. Para: Spanish version of Lazarus List Enviado: mi�rcoles, 18 de noviembre de 2009 12:37 Asunto: Re: [Lazarus-es] Como leer y escribir archivos de textos Y si no es un .INI (aunque a simple vista lo parece)... siempre puedes cargarlo en un TStringList y recorrerlo linea a l�nea. var sl: TStringList; i: Integer; begin sl:= TStringList.Create; try // Cargamos todo el fichero sl.LoadFromFile('fichero_de_datos.ini'); // Procesamos linea a linea for i:= 0 to sl.count -1 do begin Hacer_Algo_Con_Cada_Linea( sl[i] ); end; finally sl.free; end; end; El 17 de noviembre de 2009 23:22, JoshyFun <joshyfun en gmail.com> escribi�: Hello Ismael, Tuesday, November 17, 2009, 10:31:52 PM, you wrote: ILDG> Estoy tratando de leer y escribir un archivo de texto con ILDG> TFileStream pero no he podido encontrar la forma: ILDG> La estructura ser�a m�s o menos as�: ILDG> [Datos] ILDG> conexion=1 ILDG> seridor=192.168.0.1 ILDG> puerto=3050 ILDG> bd=D:\Datos\ [...] ILDG> GRACIAS por la ayuda que me puedan brindar. El archivo tiene toda la pinta de tener un formato .INI file, y para ello te ser�a m�s c�modo usar el TIniFile en vez de TFileStream. A�ade TIniFile al "uses" y ya dispones de TIniFile. -- Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to Claudio Romero: Como dice JoshyFun tiene pinta de una .INI, un ejemplo sencillo del mismo: Agregas uses…

Gracias probar� esta v�a, creo que es la m�s sencilla de todas.

Saludos cordiales y gracias reiteradas a to2s por la gran ayuda que me han brindado.
=========
�� ISMAEL ��
=========

Earlier message 38 lines
----- Mensaje original ----- De: "Claudio Romero" <clauslack en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: mi�rcoles, 18 de noviembre de 2009 05:29 Asunto: Re: [Lazarus-es] Como leer y escribir archivos de textos Como dice JoshyFun tiene pinta de una .INI, un ejemplo sencillo del mismo: Agregas uses inifiles; arriba procedure TForm1.Button1Click(Sender: TObject); var ini:Tinifile;archivo:string;UltimaActualizacion:double; BaseDeDatos,Recibido:string;LogSolicitado:integer; usaZebedee:boolean; begin archivo:=ExtractFilePath(Application.EXEName)+'archivo.ini'; if not FileExists(archivo) then begin showmessage('ERROR:no se encuentra el archivo archivo.ini'); exit; end; ini := TIniFile.Create(archivo); with ini do begin BaseDeDatos:=ReadString('Datos', 'BaseDeDatos','' ); LogSolicitado:=ReadInteger('Datos','LogSolicitado',1); UltimaActualizacion:=ReadFloat('Datos', 'UltimaActualizacion',0 ); usaZebedee:=ReadBool('Datos','UsaZebedee',false); Recibido:=ReadString('Otros', 'recibido','' ); Free; end; end; Para escribir solo pones Write en vez de Read, con algun cambio en los parametros, pero es muy sencillo. Saludos

Reply by email

JoshyFun
to Ismael L. Donis Garc?a: Como se puede en Lazarus redimensionar un arreglo de string que me mantenga los valores.…

Hello Ismael,

Thursday, November 19, 2009, 9:26:58 PM, you wrote:

ILDGa> Como se puede en Lazarus redimensionar un arreglo de string que me mantenga ILDGa> los valores.
ILDGa> En VB es: ReDim Preserve ArrHeads(i)
ILDGa> Como lograr esto en Lazarus?
ILDGa> Yo lo defin� de la siguiente forma (est� bien)? ILDGa> function Tdtmmp.iniheads(fileini: string; arrheads: array of string): ILDGa> integer;

Si es un array din�mico con SetLength(array, elementos), si no es din�mico no puedes.

Best regards, JoshyFun

Reply by email

JoshyFun
to Ismael L. Donis Garc?a: Al definirlo como: arrheads: array of string De esa forma es como se define dinamico? Te…

Hello Ismael,

Thursday, November 19, 2009, 11:21:25 PM, you wrote:

ILDGa> Al definirlo como:
ILDGa> arrheads: array of string
ILDGa> De esa forma es como se define dinamico?

Si, correcto...

ILDGa> Te paso un pequen�o ejemplo en VB para que veas lo que trato de hacer ILDGa> dim arrstr() as string 'defino la variable del arreglo sin especificar la ILDGa> longitud del arreglo
ILDGa> dim i as integer
ILDGa> dim datos as string

Visto el ejemplo parece m�s l�gico hacerlo con un TStringList que es m�s o menos un array de strings, completamente din�mico y con funciones de busqueda, ordenaci�n, extracci�n de par�metros, etc, etc.

Si prefieres hacerlo con arrays por el motivo que sea, con SetLength en vez de ReDim lo tendr�as arreglado. El SetLength es "Preserve" por definici�n, si no quieres que sea "preserve" tendr�as que hacer:

SetLength(MiArray,0); SetLength(MyArray,X);
Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to Claudio Romero: Como dice JoshyFun tiene pinta de una .INI, un ejemplo sencillo del mismo: Agregas uses…

Al definirlo como:

arrheads: array of string

De esa forma es como se define dinamico?

Te paso un pequen�o ejemplo en VB para que veas lo que trato de hacer

dim arrstr() as string 'defino la variable del arreglo sin especificar la longitud del arreglo
dim i as integer
dim datos as string

for i = 0 to 2
datos = "A" & i
redim preserve arrstr(i)
arrstr(i) = datos
i = i +1
next i

lo que queda:

arrstr(0) = A0
arrstr(1) = A1
arrstr(2) = A2

Como ser�a ese ejemplo en Lazarus

Se necesita din�mico porque de antemano no se save la cantidad de ciclos del for

Saludos cordiales y perdonen tantas preguntas
=========
�� ISMAEL ��
=========

Earlier message 29 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: jueves, 19 de noviembre de 2009 02:00 Asunto: Re: [Lazarus-es] Redimencionar arreglo string Hello Ismael, Thursday, November 19, 2009, 9:26:58 PM, you wrote: ILDGa> Como se puede en Lazarus redimensionar un arreglo de string que me mantenga ILDGa> los valores. ILDGa> En VB es: ReDim Preserve ArrHeads(i) ILDGa> Como lograr esto en Lazarus? ILDGa> Yo lo defin� de la siguiente forma (est� bien)? ILDGa> function Tdtmmp.iniheads(fileini: string; arrheads: array of string): ILDGa> integer; Si es un array din�mico con SetLength(array, elementos), si no es din�mico no puedes. -- Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to Claudio Romero: Como dice JoshyFun tiene pinta de una .INI, un ejemplo sencillo del mismo: Agregas uses…

Trato de hacerlo de la siguiente manera pero no me deja salvar los datos en el arreglo

procedure TForm1.Button2Click(Sender: TObject);
  var
    arrstr: array of string;
    i: integer;
    datos: string;
begin
  i := 0;
  for i:=0 to 2 do
    datos := 'A' + IntToStr(i);
    SetLength(arrstr, i);
    Writeln (arrstr, datos); // Aqu� me da error
    i := i + 1;
end;

Saludos
=========
�� ISMAEL ��
=========
"O�r o leer sin reflexionar es una ocupaci�n in�til". Confucio (551-479 a. C.); fil�sofo chino.

Earlier message 29 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: jueves, 19 de noviembre de 2009 02:00 Asunto: Re: [Lazarus-es] Redimencionar arreglo string Hello Ismael, Thursday, November 19, 2009, 9:26:58 PM, you wrote: ILDGa> Como se puede en Lazarus redimensionar un arreglo de string que me mantenga ILDGa> los valores. ILDGa> En VB es: ReDim Preserve ArrHeads(i) ILDGa> Como lograr esto en Lazarus? ILDGa> Yo lo defin� de la siguiente forma (est� bien)? ILDGa> function Tdtmmp.iniheads(fileini: string; arrheads: array of string): ILDGa> integer; Si es un array din�mico con SetLength(array, elementos), si no es din�mico no puedes. -- Best regards, JoshyFun

Reply by email

JoshyFun
to Ismael L. Donis Garc?a

Hello Ismael,

Thursday, November 19, 2009, 11:56:55 PM, you wrote:

ILDGa> Trato de hacerlo de la siguiente manera pero no me deja salvar los datos en
ILDGa> el arreglo
ILDGa> procedure TForm1.Button2Click(Sender: TObject);
ILDGa>   var
ILDGa>     arrstr: array of string;
ILDGa>     i: integer;
ILDGa>     datos: string;
ILDGa> begin
ILDGa>   i := 0;
ILDGa>   for i:=0 to 2 do
ILDGa>     datos := 'A' + IntToStr(i);
ILDGa>     SetLength(arrstr, i);

"i" es igual a cero, por lo tanto el array est� vacio (ning�n elemento).

ILDGa>    Writeln (arrstr, datos); // Aqu� me da error

Normal, no puedes imprimir un array, ser�a en tal caso:

WriteLn(arrastr[i],datos);
Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to Claudio Romero: Como dice JoshyFun tiene pinta de una .INI, un ejemplo sencillo del mismo: Agregas uses…

OK, gracias
=========
�� ISMAEL ��
=========
"O�r o leer sin reflexionar es una ocupaci�n in�til". Confucio (551-479 a. C.); fil�sofo chino.

Earlier message 40 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: jueves, 19 de noviembre de 2009 04:08 Asunto: Re: [Lazarus-es] Redimencionar arreglo string Hello Ismael, Thursday, November 19, 2009, 11:21:25 PM, you wrote: ILDGa> Al definirlo como: ILDGa> arrheads: array of string ILDGa> De esa forma es como se define dinamico? Si, correcto... ILDGa> Te paso un pequen�o ejemplo en VB para que veas lo que trato de hacer ILDGa> dim arrstr() as string 'defino la variable del arreglo sin especificar la ILDGa> longitud del arreglo ILDGa> dim i as integer ILDGa> dim datos as string Visto el ejemplo parece m�s l�gico hacerlo con un TStringList que es m�s o menos un array de strings, completamente din�mico y con funciones de busqueda, ordenaci�n, extracci�n de par�metros, etc, etc. Si prefieres hacerlo con arrays por el motivo que sea, con SetLength en vez de ReDim lo tendr�as arreglado. El SetLength es "Preserve" por definici�n, si no quieres que sea "preserve" tendr�as que hacer: SetLength(MiArray,0); SetLength(MyArray,X); -- Best regards, JoshyFun

Reply by email

Ismael L. Donis Garc?a
to Claudio Romero: Como dice JoshyFun tiene pinta de una .INI, un ejemplo sencillo del mismo: Agregas uses…

OK, 1 Mill�n de gracias por to2 lo aprendido
=========
�� ISMAEL ��
=========

Earlier message 40 lines
----- Mensaje original ----- De: "JoshyFun" <joshyfun en gmail.com> Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Enviado: jueves, 19 de noviembre de 2009 05:34 Asunto: Re: [Lazarus-es] Redimencionar arreglo string Hello Ismael, Thursday, November 19, 2009, 11:56:55 PM, you wrote: ILDGa> Trato de hacerlo de la siguiente manera pero no me deja salvar los datos en ILDGa> el arreglo ILDGa> procedure TForm1.Button2Click(Sender: TObject); ILDGa> var ILDGa> arrstr: array of string; ILDGa> i: integer; ILDGa> datos: string; ILDGa> begin ILDGa> i := 0; ILDGa> for i:=0 to 2 do ILDGa> datos := 'A' + IntToStr(i); ILDGa> SetLength(arrstr, i); "i" es igual a cero, por lo tanto el array est� vacio (ning�n elemento). ILDGa> Writeln (arrstr, datos); // Aqu� me da error Normal, no puedes imprimir un array, ser�a en tal caso: WriteLn(arrastr[i],datos); -- Best regards, JoshyFun

Reply by email