Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lista abierta con Tokens de STRTOK

Estas en el tema de Lista abierta con Tokens de STRTOK en el foro de C/C++ en Foros del Web. ACTUALIZACION Ya solucione el problema por si a alguien le sirve Slds, h**p://www . psicofxp.com/forums/programacion.313/961273-lista-abierta-con-tokens-de-strtok.html Mi programa abre un archivo de texto, lee linea en ...
  #1 (permalink)  
Antiguo 16/09/2009, 10:16
 
Fecha de Ingreso: septiembre-2006
Mensajes: 2
Antigüedad: 17 años, 7 meses
Puntos: 0
Lista abierta con Tokens de STRTOK

ACTUALIZACION
Ya solucione el problema por si a alguien le sirve

Slds,

h**p://www . psicofxp.com/forums/programacion.313/961273-lista-abierta-con-tokens-de-strtok.html


Mi programa abre un archivo de texto, lee linea en linea, separa las palabras por delimitadores y todo perfecto.

ahora bien las quiero almacenar en una lista abierta, pero sucede que guarda correctamente la primer linea, pero a partir de la segunda linea solo guarda porciones de texto y no la palabra completa.

Dato: si le envio manualmente datos a la lista abierta addPalabra(&lista,"palabra1")... addPalabra(&lista,"palabraN") las alamacena y las puedo recorrer perfectamente.

Problema: pero al mandarle las palabras separadas que envia el STRTOK llegan bien a la funcion y luego las almacena correctamente en el nodo nuevo->palabra pero algo mas sucede que es lo que hace que se parta las palabras al almacenarlas en la lista.

Alguien q compile al ojo... y pueda darme una mano... luego de estoy tengo q iomplementar busqueda con Expresiones regulares, pero eso sera otra historia.

Gracias.
:D

Código:
/*=======================================================
UMG 090 04 960 sombradeculto
Lee Archivo, separa lineas, lee cadenas con STRTOK y almacena en Lista Abierta 
_________________________________________________________*/

#include <stdio.h>
// strcmp
#include <string.h>
//free
#include <malloc.h>
//PAUSE
#include <stdlib.h>
	int c,i;

   char* token;  //  guarda temporalemte TOKEN obtenido
   char  linea[256]; // Recibe linea a linea del .txt

   char delim[] = {" \n\t"};  // delimitadores para TOKEN
   void serializar (void);  // Proceso que serializa TOKEN y crea lista de palabras
/*=======================================================
Estructura para almacenar las palabras para realizar busqueda con expresiones
_________________________________________________________*/
   typedef struct _nodo{
   	char *palabra;
      struct _nodo *siguiente;
   }tipoNodo;

   typedef tipoNodo *Lista;
   typedef tipoNodo *pNodo;

   void addPalabra(Lista *l, char *palabra);
   void freeMem(Lista *);
   void recorrerLista(Lista l);
   int listaVacia(Lista l);

   Lista lista = NULL; // Se crea lista NULL
//=======================================================

int main(void){

   freeMem(&lista);
   serializar();

   addPalabra(&lista,"HOLA1");
   addPalabra(&lista,"HOLA2");
   addPalabra(&lista,"HOLA3");
   addPalabra(&lista,"DOLA4");
   addPalabra(&lista,"HOLA5");
   addPalabra(&lista,"HOLA6");

   recorrerLista(lista);
   freeMem(&lista);
   recorrerLista(lista);

   system ("PAUSE");
   return 0;
}
/*=======================================================
	Abre el archivo lee por lineas separa por palabras y
	envia a estructura de nodos*/
void serializar (void){
	// Abre el .txt relativo en la carpeta
	FILE *f = fopen("texto.txt","r");
   char *temp;

	if (f==NULL){
   	perror("Error al abrir el fichero") ;
   }else{
   	while ( (fgets(linea,256,f)) != NULL){
         printf("%s\n",linea);
         token = strtok(linea, delim);

         while (token){
         	//printf("Token: %s\n",token);

            addPalabra(&lista, token);
            //addPalabra(&lista, token = strtok(NULL, delim));
            token = strtok(NULL, delim);

            c++;
         };
      };
      fclose(f);
	}
   free(token);
}
/*=======================================================
	Inserta Nueva palabra a listado de nodos */

void addPalabra(Lista *lista, char *palabra){
	pNodo nuevo, anterior;

   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->palabra = palabra;
   //printf("tOkEn: %s\n",nuevo->palabra);

   if ( nuevo->palabra == '\0' || nuevo->palabra == '\n' || nuevo->palabra == NULL){
   	printf("Llego un null\n");
   }else{

   if (listaVacia(*lista)) {
   	nuevo->siguiente = *lista;
      *lista = nuevo;
      //printf("tOkEn: %s\n",nuevo->palabra);
   }else{
   	anterior = *lista;
      while (anterior->siguiente) anterior = anterior->siguiente;
   	nuevo->siguiente = anterior->siguiente;
      anterior->siguiente = nuevo;
   }
   }
}
/*=======================================================
	Revisa si la lista de palabras esta vacia */
int listaVacia(Lista lista){
	return (lista == NULL);
}
/*=======================================================
	Recorre la lista */
void recorrerLista(Lista lista){
	pNodo nodo = lista;
   if (listaVacia(lista)) printf("Lista Vacia\n");
   else{
   	//for (i=0; i < c; i++){
      while (nodo){
      	printf("LISTA: %s\n", nodo->palabra);
         nodo = nodo->siguiente;
      }
   }
}
/*=======================================================
	Libera la memoria utilizada por la lista */
void freeMem(Lista *lista){
	pNodo nodo;
   while (*lista){
   	nodo = *lista;
      *lista = nodo->siguiente;
      free(nodo);
   }
}

Última edición por sombradeculto; 22/09/2009 a las 15:07 Razón: SOLUCIONADO
  #2 (permalink)  
Antiguo 22/09/2009, 15:07
 
Fecha de Ingreso: septiembre-2006
Mensajes: 2
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Lista abierta con Tokens de STRTOK

Solucionado...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:17.