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);
}
}