Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

leer palabras de una línea usando delimitador, por ejemplo #

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: leer palabras de una línea usando delimitador, por ejemplo # Responder citando

Hola, necesito vuestra ayuda, e intentado de miles maneras leer un fichero de texto (en txt). Quiero leer línea por línea y almacenar cada palabra de cada línea en una variable. Cada palabra de cada línea está separada de la siguiente por el símbolo #

¿cómo puedo hacerlo? Me estoy volviendo loco y no doy con ningún resultado.

muchísimas gracias por adelantado!
Ropurod
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Preparamos una variable global TStringList que nos va a guardar todas las palabras obtenidas al final del proceso, dicha variable la iniciamos por ejemplo en el constructor del formulario principal:
Código:

TStringList *palabras;
//----------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    palabras = new TStringList;
}
//---------------------

En el evento OnClose nos encargamos de liberar memoria del TStringList creado previamente:
Código:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if (palabras){
      delete palabras;
    }
}

Y un ejemplo para pasar todas las palabras de un archivo de texto separadas por '#' a nuestro StringList "palabras" podría ser:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *lista = new TStringList;
    TStringList *list2 = new TStringList;
    lista->LoadFromFile(ExtractFilePath(Application->ExeName)+"proves.txt");
    palabras->Clear();
    for (int i=0;i<lista->Count;i++){
      list2->Delimiter = '#';
      list2->DelimitedText = lista->Strings[i];
      for (int a=0;a<list2->Count;a++){
        palabras->Add(list2->Strings[a]);
      }
    }
    delete list2;
    delete lista;
}

Para poder ver el resultado puedes hacerlo por ejemplo utilizando el OnClick de otro botón:
Código:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    ShowMessage(palabras->Text);   
}

Para acceder al valor de cada una de las palabras bastará con que recorras el StringList "palabras" y accedas al índice de lista que te interese.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

En cuanto pueda me pongo a chequear el código que me has pasado. Muchas gracias!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Hola, Ropurod.

Si quieres algo más portable puedes recurrir a la STL y trabajar con string y list<string>. Es algo más complejo que lo que te propone Tugui pero es más independiente de los cambios que Borland introduzca en sus librerías.

Borland tiene un ejemplo muy majo para lo que pides: example, split a line into words, que está relacionado con otro ejemplo: Example: a concordance, que puedes encontrar en el índice de la ayuda como map and multimap,example programs.

Suerte.
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No es lo que pides, exactamente pero espero te oriente

Código:

AnsiString Token;
int iPos;
int iPos_Final;
AnsiString sCadena;
AnsiString sUltimaLinea;
//iRegistros=qry->RecordCount;

for(int i=0;i<lst->Items->Count;i++)
{
         sCadena=lst->Items->Strings[i];
         sUltimaLinea=sCadena;
         iPos = sCadena.Pos("[");
         while (iPos)
            {
            iPos_Final=sCadena.Pos("]") ;
            Token = sCadena.SubString(iPos+1,iPos_Final-iPos-1);
            if(Token=="sisFecha")
              Token=DateToStr(Date());
            if(Token=="sisHora")
              Token=TimeToStr(Time());
            if(Token=="sisMensaje")
              Token=sMensaje;
           

            sCadena=sCadena.SubString(1,iPos-1)+Token+sCadena.SubString(iPos_Final+1,sCadena.Length()-iPos_Final);
            lst->Items->Strings[i]=sCadena;
            iPos = sCadena.Pos("[");

           }



  }

_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Esta funcion ronda por el foro solo hay que buscar... un poco mas

Código:
//*******************funicion que divide una cadena  a partir de un caracter ****
TStrings *__fastcall DivideCadena(AnsiString ctmp, AnsiString LetraDivisora){
   TStringList *ArregloCadena = new TStringList();
    int pos=ctmp.Pos(LetraDivisora);
    if(pos!=0){
        ArregloCadena->Add(ctmp.SubString(1,pos-1));
        ctmp=ctmp.SubString(pos+1,ctmp.Length());
        pos=ctmp.Pos(LetraDivisora);
        while (pos!=0){
            if (pos!=0){
                ArregloCadena->Add(ctmp.SubString(1,pos-1));
                ctmp=ctmp.SubString(pos+1,ctmp.Length());
            }
        pos=ctmp.Pos(LetraDivisora);
        }
        ArregloCadena->Add(ctmp.SubString(1,ctmp.Length()));
    }else{
          ArregloCadena->Add(ctmp);
    }
  return (ArregloCadena);
}


y una forma de usarla en tu caso seria de la siguiente manera

primero cargamos el archivo
Código:
TStringList *Archivo = new TStringList();
Archivo->LoadFromFile(Ruta_y_Nombre_del_Archivo);


supongamos que el archivo tiene las siguientes lineas

cesar#cuauhtemoc
Salazar#Gonzalez#C++ Builder

ahora bien, lo que hay que hacer es usar la funcion divide cadena por ejemplo sacando la linea 2 del archivo esto funciona asi

Código:
TStringList *Palabras;
Palabras = DivideCadena(Archivo->Strings[1],"#");

y en la nueva lista, viene algo como esto, escritas en desorden

Código:
Palabras->Strings[2]; // C++ Builder
Palabras->Strings[0];//Salazar
Palabras->Strings[1];//Gonzalez

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.