Suponiendo que funcione tal cual está, como accedes a cada elemento? Sobre un tipo char haciendo matriz[i] te mostrará solo el caracter que haya en la posicion 'i' en vez de la palabra guardada bajo el indice 'i'
De todas formas tienes algun que otro error de interpretacion: p.ej. que tamaño esperas que tendrá la variable 'linea' cuando 'matriz' apunte a un bloque de memoria de 5000 gigas? Tendra solamante 4 bytes porque el sizeof de un puntero es 4 bytes independientemente del bloque de memoria al que esté referenciado ok?
Me parece (puede que haya otra solucion, no se) que deberias usar una lista enlazada, donde los elementos sean estructuras con un puntero a la siguiente estructura y un bloque para la palabra (lo que sería una tipica linked list), seguramente puedes encontrar alguna librería para usar listas, pero por si quieres hacerta la tuya propia aquí de tejo un ejemplo de una solucion a tu problema - que conste que ya se que no debería hacer esto de colgar codigo completo :)
Primero la estructura de datos global accesible desde todas las funciones:
Código:
struct PALABRA {
char *data;
struct PALABRA *siguiente;
};
Ahora la funcion leer, que basicamente lo que hace es cargar los datos linea por linea, parsear por espacios y crear dinamicamente los elementos de la lista:
Código:
void leer(char *archivoTexto, struct PALABRA **lista){
FILE* archivo;
char *linea, *pch;
unsigned long int dw;
struct PALABRA *palabra, *rec;
if((archivo = fopen(archivoTexto, "r")) == NULL){
perror("error al abrir el fichero texto.txt\n");
}
else{
fseek(archivo, 0L, SEEK_END);
dw = ftell(archivo);
fseek(archivo, 0L, SEEK_SET);
linea = malloc(dw);
memset(linea, 0, dw);
while(fgets(linea, dw, archivo)){
pch = strtok (linea," ");
while(pch) {
palabra = malloc(sizeof(struct PALABRA));
palabra->siguiente = NULL;
palabra->data = malloc(strlen(pch)+1);
memcpy(palabra->data, pch, strlen(pch));
palabra->data[strlen(pch)] = '\0';
if(!*lista) {
*lista = palabra;
}
else {
rec = *lista;
while(rec->siguiente) {
rec = rec->siguiente;
}
rec->siguiente = palabra;
}
pch = strtok(0, " ");
}
}
free(linea);
}
}
Cosas importantes: el tamaño de linea es necesariamente el tamaño del archivo por si acaso solo hubiera una sola linea muy larga. La forma de implementar una linked list es estandar: creas un elemento y luego lo guardas en la lista de forma que si la lista es nula, le asignarás el nuevo elemento, si no es nula buscarás el ultimo elemento de la lista y al puntero 'siguiente' le asignaras el nuevo elemento. Ten en cuenta que toda esta memoria tiene que ser liberada al finalizar la aplicacion. Normalmente no se implementa un manipulador de linked list dentro de la funcion, sino que se crean nuevas funciones para ello, mas que nada por lo de la claridad de codigo y todo eso.
Y ahora la llamada desde el main:
Código:
struct PALABRA *lista_palabras, *rec;
lista_palabras = NULL;
leer("archivo.txt", &lista_palabras);
while(lista_palabras) {
printf("%s\n", lista_palabras->data);
rec = lista_palabras->siguiente;
free(lista_palabras->data);
free(lista_palabras);
lista_palabras = rec;
}
El bucle simplemente muestra los datos cargados y a la vez libera la memoria de la lista; como te he comentado antes lo normal sería crear a parte una funcion para liberar la memoria, pero para el ejemplo esto ya sirve.
Puedes encontrar por ahi mas informacion acerca de las listas enlazadas, aquí solo te he puesto un ejemplo simple.
Saludos
vosk