insertar palabra por palabra a una matriz

Iniciado por Fabi0lo, 20 Octubre 2012, 04:47 AM

0 Miembros y 1 Visitante están viendo este tema.

Fabi0lo

Buenas, quería leer desde un archivo y almacenar palabra por palabra en una matriz, por lo que cada uno de los vectores almacenaré una palabra.

He intentado hacerlo, pero sin éxito, en que me estaré confundiendo??


char** matriz = (char**)malloc(sizeof(char*)*512);
leer("texto.txt", matriz, 10);


#include <stdio.h>

void leer(char *archivoTexto, char** matriz, int palabras){

FILE* archivo;
int i = 1;
char linea [sizeof(matriz)];

if((archivo = fopen(archivoTexto, "r")) == NULL){
perror("error al abrir el fichero texto.txt\n");
}
else{
while(fgets(linea, sizeof(linea), archivo)){
matriz[0] = strtok(linea, " ");
printf("%s ", matriz[0]);
for( ;(matriz[i] = strtok( NULL, " ")) != NULL && i < palabras; i++){
printf("%s ", matriz[i]);
}
}
}
}
PD:
1º argumento: nombre del archivo que quiero leer
2º argumento: la matriz donde quiero insertar las palabras (1 en cada vector)
3º argumento: las cantidad de palabras que quiero insertar a la matriz

Pero justo cuando se imprime las palabras desde la matriz, lo único que me imprime es (null)


xiruko

estas reservando memoria para un array de punteros a caracter, pero luego no reservas memoria para cada uno de esos punteros. suponiendo que quieres que la matriz contenga NumPal palabras y que cada palabra tenga un maximo de NumLet letras (sin incluir el NULL al final):

char** matriz=(char**)malloc(NumPal*sizeof(char*));
for (j=0; j<NumPal; j++) matriz[j]=(char*)malloc((NumLet+1)*sizeof(char));


y al final de programa, no te olvides de liberar la memoria reservada:

for (j=0; j<NumPal; j++) free(matriz[i]);
free(matriz);


un saludo!

Fabi0lo

Gracias, no sabía que había que reservar también cada uno de los vectores, pensaba que con tener la matriz reservada ya estaba para llegar y escribir en ella.

Pero sin embargo el problema insiste, de hecho, luego de declarar la matriz con sus vectores, verifico su tamaño con sizeof(matriz), me retorna 8, por lo que el String linea tiene tamaño 8, le puse tamaño 1024, ya que si leo un párrafo, este no tiene salto de lineas, es una linea continua hasta que llega a un punto aparte.

char** matriz = (char**)malloc(sizeof(char*)*numPal);
for (j=0; j<numPal; j++) matriz[j] = (char*)malloc(15*sizeof(char));


void leer(char *archivoTexto, char** matriz, int palabras){

FILE* archivo;
int i = 1;
char linea [1024];

if((archivo = fopen(archivoTexto, "r")) == NULL){
perror("error al abrir el fichero\n");
}
else{
while(fgets(linea, sizeof(linea), archivo)){
matriz[0] = strtok(linea, " ");
printf("%s ", matriz[0]);
for( ;(matriz[i] = strtok( NULL, " ")) != NULL && i < palabras; i++){
printf("%s ", matriz[i]);
}
}
}
printf("\n\n");
}


Por cierto... soy nuevo en C y aun no capto miles de cosas, cuando me mostraste como asignarle memoria a matriz con malloc "(char**)malloc(NumPal*sizeof(char*))", no le estoy asignando el tamaño de memoria NumPal a toda la matriz? o le estoy asignando ese tamaño a cada vector?

PD2: Apesar del cambio, sizeof(matriz) me sigue arrojando tamaño 8, pero sin embargo, la matriz almacena todo el texto, que es lo que me está devolviendo sizeof??

rir3760

El operador "sizeof" resulta en el tamaño del objeto, por ejemplo:
char *p = malloc(100);
size_t num_elem = sizeof p;

Ahi el resultado de ""sizeof p" es "sizeof(char *)", usualmente cuatro.


Si lo que se desea no es el tamaño del puntero sino del objeto apuntado (el resultado de malloc, el bloque de cien caracteres) no hay mas opción que llevar la cuenta de forma "manual" (mediante una variable):

char *p = malloc(100);
size_t num_elem = 100;



Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language