| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Ropurod Cdt


Registrado: 19 Nov 2005Mensajes: 8Ubicación: Elche-Alicante (España)
|
Publicado: Jue 15 Dic, 2005 10:31 am Asunto: leer palabras de una línea usando delimitador, por ejemplo # |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Jue 15 Dic, 2005 12:14 pm Asunto: |
|
|
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 |
|
 |
Ropurod Cdt


Registrado: 19 Nov 2005Mensajes: 8Ubicación: Elche-Alicante (España)
|
Publicado: Jue 15 Dic, 2005 12:30 pm Asunto: |
|
|
| En cuanto pueda me pongo a chequear el código que me has pasado. Muchas gracias!! |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Sab 17 Dic, 2005 10:25 am Asunto: |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Mar 20 Dic, 2005 3:44 am Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 20 Dic, 2005 10:23 am Asunto: |
|
|
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 |
_________________
 |
|
| Volver arriba |
|
 |
|