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 02-02-2008
intercubo intercubo is offline
Miembro
 
Registrado: feb 2008
Posts: 11
Poder: 0
intercubo Va por buen camino
Post Leer archivo txt letra por letra

hola:


soy nuevo en delphi y quisiera saber como puedo leer un archivo de texto .txt letra por letra en un ciclo.

entre mas explicitos sean mejor, les agradezco mucho!
Responder Con Cita
  #2  
Antiguo 02-02-2008
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
Cita:
Empezado por intercubo Ver Mensaje
hola:


soy nuevo en delphi y quisiera saber como puedo leer un archivo de texto .txt letra por letra en un ciclo.

entre mas explicitos sean mejor, les agradezco mucho!
Hola Intercubo, te invito a que leas la guia de estilo de club, y porque no muestras el código que ya tienes (porque supongo que ya lo intentaste hacer) y en base a eso te podremos ayudar.
Saludos
Responder Con Cita
  #3  
Antiguo 02-02-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Con un archivo de tipo. Concretamente Char. Sería algo así.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  N: Integer;
  C: Char;
  F: File Of Char;
begin
  AssignFile(F, Edit1.text);
  Reset(F);
  for N:=0 to FileSize(F) - 1 do
    begin
      Seek(F, N);
      Read(F, C);
      Memo1.Text:=Memo1.Text+C;
    end;
  CloseFile(F);
end;

Pero aviso, esto ya lo he hecho, y para archivos considerablemente granes es muy lento. Incluso si haces Memo1.Lines.BeginUpdate antes de empezar, y Memo1.Lines.EndUpdate después de acabar, sigue siendo lento para archivos de varios Megabytes.

Por cierto, intercubo, bienvenido al club. Haz caso de lo que dice juanelo la próxima vez.


Salu2.
Responder Con Cita
  #4  
Antiguo 02-02-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
He editado mi post porque no era instructivo.

El anterior código de ixMike funciona a la perfeccioón, sin embargo no es necesario hacer el Seek antes de cada lectura si es que el resultado esperado debe es secuencial y no aleatorio. Las funciones de lectura en la mayoria de los casos (si no es en todos), se encargan de realizar dicha opertación internamente.

Saludos

Última edición por cHackAll fecha: 02-02-2008 a las 01:24:07. Razón: No era un post claro
Responder Con Cita
  #5  
Antiguo 06-02-2008
intercubo intercubo is offline
Miembro
 
Registrado: feb 2008
Posts: 11
Poder: 0
intercubo Va por buen camino
Post

hola:

me marca un error I/O 103 en el siguiente codigo:

Código Delphi [-]
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Col: Integer;
  Edo: Integer;
  N: Integer;
  C: Char;
  F: File Of Char;
  x: Integer;
begin
  Col:=0;
  Edo:=1;
  AssignFile(F, Edit1.text);
  Reset(F);
  for N:=0 to FileSize(F) - 1 do
    begin
     Read(F, C);
      for x:=0 to 25 do
        begin
          if C=Matriz[0][x] then
            begin
              Col:=x;
              Edo:=StrToInt(Matriz[Edo][Col]);
            end;
            Memo1.Text:=Memo1.Text+Matriz[Edo][Col];
        end;
  CloseFile(F);
    end;
end;

estuve leyendo que el problema es que no se use el Reset(F) pero yo si lo tengo, de un momento a otro comenzo a fallar no se que hice mal.

gracias!
Responder Con Cita
  #6  
Antiguo 06-02-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Me parece que ese error se produce cuando el archivo no existe. Es decir, el archivo escrito en Edit1.Text tiene que existir. Prueba con esto:

Código Delphi [-]
If not FileExists(Edit1.Text) then
  begin
  ShowMessage('El archivo "'+Edit1.text+'" no existe.');
  Exit;
  end;
AsignFile(F, Edit1.text);
{...}
Responder Con Cita
  #7  
Antiguo 11-02-2008
intercubo intercubo is offline
Miembro
 
Registrado: feb 2008
Posts: 11
Poder: 0
intercubo Va por buen camino
Post

el archivo si existe y tiene caracteres, he tratado cambiando el nombre de archivo pero sigue pasando lo mismo. cambio de nombre en edit1.text y en el archivo. y como dije antes si existe y la ruta es correcta.

agradeceria que me dijeran otras opciones porfavor.

mil gracias!
Responder Con Cita
  #8  
Antiguo 11-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
¿En que parte del código te da error?
¿Seguro que es ese el error?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 11-02-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 18
felipe88 Va por buen camino
Porque no pruebas creando un StringList en el que cargues tu archivo y de alli intentas asignar a cada linea se texto como un String; que en resumidas cuentas es un vector, con lo que podrias mediante una sentencia for recorrer caracter por caracter del texto...
__________________
Web
Responder Con Cita
  #10  
Antiguo 11-02-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por intercubo Ver Mensaje
...agradeceria que me dijeran otras opciones...
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var hFile: Cardinal; Value: Char;
begin
 hFile := _lopen(PChar(Edit1.Text), OF_READ);
 if hFile = -1 then Exit; // No se pudo abrir el archivo
 while LongBool(_lread(hFile, @Value, 1)) do
  Memo1.Text := Memo1.Text + Value;
 CloseHandle(hFile);
end;
Responder Con Cita
  #11  
Antiguo 12-02-2008
Avatar de PepeLolo
PepeLolo PepeLolo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Fuenlabrada - Madrid - Espagna
Posts: 265
Poder: 21
PepeLolo Va por buen camino
Talking

Otro ejemplo totalmente funcional.

Código Delphi [-]
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm2 = class(TForm)
    Efile: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
Var cStrings :TStrings;
    nLeng, i :Integer;
    cLetra :Char;
begin
  cStrings := TStrings.Create;
  try
    cStrings.LoadFromFile(Efile.text);
    nLeng := Length(cStrings.Text);
    for I := 0 to nLeng do
     begin
        cLetra := cStrings.Text[i];   // Leer letra a letra o mejor dicho carácter a carácter
        // lo que quieras hacer con dicha letra
     end;
  finally
     cStrings.free;
  end;
end;
end.

un saludo
__________________
PepeLolo
El hombre el único virus que mide más de unas cuantas micras
Responder Con Cita
  #12  
Antiguo 12-02-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 18
felipe88 Va por buen camino
Cita:
Empezado por PepeLolo Ver Mensaje
Otro ejemplo totalmente funcional.


Código Delphi [-]
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm2 = class(TForm)
    Efile: TEdit;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
Var cStrings :TStrings;
    nLeng, i :Integer;
    cLetra :Char;
begin
  cStrings := TStrings.Create;
  try
    cStrings.LoadFromFile(Efile.text);
    nLeng := Length(cStrings.Text);
    for I := 0 to nLeng do
     begin
        cLetra := cStrings.Text[i];   // Leer letra a letra o mejor dicho carácter a carácter
        // lo que quieras hacer con dicha letra
     end;
  finally
     cStrings.free;
  end;
end;
end.





un saludo
A algo asi me referia... el ejemplo de PepeLolo es totalmente funcional...
__________________
Web
Responder Con Cita
  #13  
Antiguo 12-02-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por felipe88 Ver Mensaje
A algo asi me referia... el ejemplo de PepeLolo es totalmente funcional...
Vaya... debo repasar esto del Delphi que creo que no es lo mio
Responder Con Cita
  #14  
Antiguo 12-02-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 18
felipe88 Va por buen camino
Cita:
Empezado por cHackAll Ver Mensaje
Vaya... debo repasar esto del Delphi que creo que no es lo mio
... no te preocupes cHackAll... a lo que me refiero es que asi me lo imagine yo e igualmente funciona, yo tambien soy novato... Pero definitivamente tu tienes una idea simple y concreta... tampoco pienso entrar en polemica por cual sea el mejor algoritmo, eso es decision de quien lo usara...
__________________
Web
Responder Con Cita
  #15  
Antiguo 16-02-2008
intercubo intercubo is offline
Miembro
 
Registrado: feb 2008
Posts: 11
Poder: 0
intercubo Va por buen camino
Post

Hola:
aki ando de nuevo, lo que pasa ahora esque quiero que cuando suceda un cierto evento el ciclo for no se incremente, y asi vuelva a leer el ultimo caracter que leyo.

hay alguna funcion para hacer eso, que desde cierto punto del ciclo for, por ejemplo desde dentro de un If le puedas mandar una orden al ciclo para que repita el ultimo giro, y no incremente la variable?

Código Delphi [-]
for N:=0 to FileSize(F) -1  do
    begin
      Seek(F, N);
      Read(F, C);
       for x:=0 to 2 do
        begin
      if C=Letras[x] then
              Col:=1;
        end;
        for x:=0 to 9 do
        begin
          if C=InttoStr(Numeros[x]) then
              Col:=3;
        end;
      for x:=0 to 25 do
        begin
          if C=columnas[x] then
            begin
              Col:=x;

            end;
        end;

              if Edo>=0 then
                Begin
                  Edo:=Matriz[Edo][Col];
                  Memo1.Text:=Memo1.Text+C;
                  Edit2.Text:=Edit2.Text+InttoStr(Edo);
                  Edit3.Text:=Edit3.Text+InttoStr(Col);
                  Lexema:=Lexema+C;
                End
              Else
                Begin
                  Edo:=0;
                  AQUI QUIERO QUE SE REGRESE Y NO INCREMENTE A N, PARA QUE PUEDA LEER EL ULTIMO CARACTER QUE LEYO
                end;
  CloseFile(F);
end;

gracias!

Última edición por intercubo fecha: 16-02-2008 a las 21:24:32.
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
Cargar archivo de tipo de letra TTF dabas Varios 5 18-06-2010 20:40:09
Canal de Letra en Archivo Midi cacuna Varios 2 17-03-2005 20:01:54
Pulsar una letra en un DBgrid y que vaya al campo que empiece por esa letra Nbull SQL 8 16-12-2004 17:58:01
De número a letra samame Varios 1 10-03-2004 17:31:41
color y letra en un archivo .ini VolaRe Varios 4 05-02-2004 21:36:29


La franja horaria es GMT +2. Ahora son las 20:12:24.


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