Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   TStringList.LoadFromFile y líneas con caracteres #0 (https://www.clubdelphi.com/foros/showthread.php?t=55228)

Lord Delfos 10-04-2008 21:00:50

TStringList.LoadFromFile y líneas con caracteres #0
 
Hola, gente. A ver si a alguien le ha pasado esto.

Estoy levantando unos archivos de texto con una TStringList y después proceso cada una de las líneas.

Todo funciona muy lindo, pero uno de los archivos tiene una línea algo como esto:

HG99833DGI00092008-08-10003333[---------------]

El [---------------] son caracteres ASCII #0.

Resulta que la después de cargar, stringlist me dice que Count=1. Lo que no entiendo es porqué o cómo solucionarlo, ya que el archivo no puede tocarse de ninguna forma y, aunque podría usar otra cosa que no sea stringlist (como abrirlo y leerlo con ReadLn) la cosa sería usar TStringList.

Gracias de antemano, gente.

Al González 10-04-2008 22:12:28

Cita:

Empezado por Lord Delfos (Mensaje 279075)
...Resulta que la después de cargar, stringlist me dice que Count=1. Lo que no entiendo es porqué...

A primera vista, parece que la causa está en el método TStrings.SetTextStr, llamado por LoadFromStream, llamado por LoadFromFile.

Código Delphi [-]
      while P^ <> #0 do
      begin
        Start := P;
        while not (P^ in [#0, #10, #13]) do Inc(P);
        SetString(S, Start, P - Start);
        Add(S);
        if P^ = #13 then Inc(P);
        if P^ = #10 then Inc(P);
      end;

Según se ve, descarta lo que haya en el resto del texto en cuanto encuentra un carácter ASCII 0, 10 (avance de línea) o 13 (retorno de carro). He ahí la razón.

Cita:

Empezado por Lord Delfos (Mensaje 279075)
...o cómo solucionarlo...

Trataré de darme algo de tiempo más tarde para ver una posible solución. Pero ojalá alguno de los compañeros se me adelante para que no tengas que esperar demasiado. Por lo pronto tengo sólo vagas ideas, como usar un TFileStream directamente y extraer las cadenas de forma manual.

Un abrazo sin-cero.

Al.

Lord Delfos 11-04-2008 14:22:41

¡Gracias Al!

No había visto ese método. Cosa rara esto de los #0. Igual no se supone que un TXT tenga #0s... pero bueno.

Cita:

Empezado por Al González (Mensaje 279117)
Trataré de darme algo de tiempo más tarde para ver una posible solución. Pero ojalá alguno de los compañeros se me adelante para que no tengas que esperar demasiado. Por lo pronto tengo sólo vagas ideas, como usar un TFileStream directamente y extraer las cadenas de forma manual.

No te hagás problemas, algo voy a sacar.

Gracias por contestar.

Lord Delfos 11-04-2008 14:36:12

Bueno, probé y funcionó.:rolleyes:

Código Delphi [-]

type TStringLista=class(TStringList)
  protected
    procedure SetTextStr(const Value: string); override;
end;

procedure TStringLista.SetTextStr(const Value: string);
var
  P, Start: PChar;
  S: string;
begin
  BeginUpdate;
  try
    Clear;
    P := Pointer(Value);
    if P <> nil then
      while P^ <> #0 do
      begin
        Start := P;
        while not (P^ in [#10, #13]) do Inc(P);
        SetString(S, Start, P - Start);
        Add(S);
        if P^ = #13 then Inc(P);
        if P^ = #10 then Inc(P);
      end;
  finally
    EndUpdate;
  end;       
end;

No es que lo haya probado una cosa bárbara, pero parece funcionar maravillosamente...:)

seoane 11-04-2008 14:48:52

El problema es que si el archivo de texto no termina en un salto de linea nunca saldrías de esta bucle:
Código Delphi [-]
while not (P^ in [#10, #13]) do Inc(P);


La franja horaria es GMT +2. Ahora son las 09:24:40.

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