Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-04-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 10-04-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

Cita:
Empezado por Lord Delfos Ver Mensaje
...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 Ver Mensaje
...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.
Responder Con Cita
  #3  
Antiguo 11-04-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
¡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 Ver Mensaje
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.
Responder Con Cita
  #4  
Antiguo 11-04-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
Bueno, probé y funcionó.

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...
Responder Con Cita
  #5  
Antiguo 11-04-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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);
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con LoadFromFile sergiosantiago1 Gráficos 5 11-04-2008 17:02:47
Problema con Timage despues de hacer LoadFromFile JarLem Varios 6 13-12-2007 11:06:46
problemas con el LoadFromFile sac OOP 14 19-07-2007 16:55:34
LoadFromFile con una progressbar Jesús Pena Varios 5 18-04-2007 20:19:24
Problemas con Picture.LoadFromFile Ohcan Varios 6 04-02-2005 23:29:34


La franja horaria es GMT +2. Ahora son las 14:58:09.


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
Copyright 1996-2007 Club Delphi