Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   No puedo leer un archivo grande. (https://www.clubdelphi.com/foros/showthread.php?t=74796)

martinartaza 12-07-2011 05:53:28

No puedo leer un archivo grande.
 
Hola querida comunidad, le comento tengo 2 archivos:
Prueba.txt que su contenido es:
Cita:

Hola
Mundo
Y tengo otro archivo llamado paciente.txt
que su contenido es
Cita:

50
45
52
....
FF
El archivo pacientes tiene 192 KB.

Eh probado con un memo y distintos métodos para abrir el archivo, con todos estos métodos si pongo el archivo prueba, me funciona bien, pero si elijo paciente me funciona mal.

Para simplificar en un form tire varios botones con las distintos código que probé.

Código Delphi [-]

procedure TForm1.loadfromfileClick(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('Pacientes.txt');
end;

procedure TForm1.assignedfileClick(Sender: TObject);
var F: TextFile;
    sLinea: String;
begin
  AssignFile( F, ExtractFilePath( Application.ExeName ) + 'Pacientes.txt' );
  Reset( F );

  while not Eof( F ) do
  begin
    ReadLn( F, sLinea );
    Memo1.Lines.Add( sLinea );
  end;

  CloseFile( F );
end;

procedure TForm1.filestreamClick(Sender: TObject);
var
  F: TFileStream;
  s: String;
begin
  F := TFileStream.Create( ExtractFilePath( Application.ExeName ) + 'Pacientes.txt', fmOpenRead );
  SetLength( s, F.Size ); // *** Me faltaba esto, gracias por la corrección ***
  F.Read( s[1], F.Size );
  Memo1.Text := s;
  F.Free;
end;

procedure TForm1.readbyteClick(Sender: TObject);
var F: TFileStream;
    Buffer: array[0..1023] of byte;
begin
  F := TFileStream.Create( ExtractFilePath( Application.ExeName ) + 'Pacientes.txt', fmOpenRead );

  // ¿No ha llegado al final de archivo?
  while F.Position < F.Size do
  begin
    // Leemos un bloque de 1024 bytes
    F.Read( Buffer, 1024 );
    memo1.Lines.Add(String(PCHAR(@Buffer[0])));
    // podemos hacer lo que queramos con el antes de cargar el siguiente bloque
  end;

  F.Free;

end;

procedure TForm1.readhexaClick(Sender: TObject);
var F: file of byte;
  i: Integer;
  Buffer: array[0..1] of Byte;
begin
  AssignFile( F, ExtractFilePath( Application.ExeName ) + 'Pacientes.txt' );
  Reset( F );
  Seek( F, 0 );
  BlockRead( F, Buffer, 2 );

  for i := 0 to 2 do
    Memo1.Text := Memo1.Text + IntToHex( Buffer[i], 2 ) + ' ';

  CloseFile( F );
end;

Subo el archivo para ver si alguien lo puede leer o sea que le muestre lo mismo que le muestra el block de nota a la hora de hacer 2 clic.

https://sites.google.com/site/vamoss...edirects=0&d=1

Desde ya muchas gracias.

Chris 12-07-2011 06:50:29

Cita:

Empezado por martinartaza (Mensaje 406061)
... pero si elijo paciente me funciona mal.

A qué te referieres con "me funciona mal..."?

Saludos,
Chris

DarKraZY 12-07-2011 09:09:24

Creo que he dado con la respuesta.

He estado haciendo algunas pruebas (porque he sentido curiosidad) y "nada funcionaba". Es decir... en el Memo1 no aparece el texto sino unos carácteres
Cita:

ÿþ5
raros.

Así que (y gracias a Notepad++) creo que el problema está en la codificación del fichero de texto (UCS2 Little Indian).

Saludos!

martinartaza 12-07-2011 13:44:04

Me refiero a que anda mal, que no me muestra
 
Me refiero a que anda mal a que no me muestra lo mismo que el block de nota y me muestra como dice DarKraZY
Cita:

ÿþ5
Muchísimas gracias DarKraZY
Como el archivo me lo dio mi tutora no sabia nada al respecto.
Que es lo que debo hacer, copiar y pegar el contenido a un nuevo archivo o puedo de alguna forma cambiar la codificación del mismo?

La idea a futuro es que yo genere estos archivos, tomando datos de un micro. Mi tutora me facilito este archivo debido a que al dispositivo lo estaban modificando y no podía acceder al mismo, pero por ahora debo leer datos de estos archivos.

Caro 12-07-2011 19:43:39

Cita:

Empezado por martinartaza (Mensaje 406104)
Que es lo que debo hacer, copiar y pegar el contenido a un nuevo archivo o puedo de alguna forma cambiar la codificación del mismo?

Hola martinartaza, si tienes el Notepad ++ cambias la codificación "UCS2 Little Indian" a "ANSI", si no lo tienes, solo te queda copiar todo el contenido en nuevo archivo txt.

Saluditos

martinartaza 12-07-2011 21:02:11

si, era eso el archivo estaba endemoniado.
 
si con el notepad++ cambie el formato y listo, muchas gracias por tu curiosidad DarKraZY, y por tu ayuda caro.


La franja horaria es GMT +2. Ahora son las 19:52: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