Soy nuevo en C, así que avísame si ves algo estúpido por mi parte 🙂
Tengo un archivo que tiene valores de cadena separados de nueva línea que estoy tratando de leer en mi progtwig para poder usarlos para compararlos con otros valores Pensé que la mejor manera de almacenarlos sería en una matriz multidimensional. Mi código se ve algo como esto:
char **data; char *src_line; int counter = 0; /* To keep track of how many items are in this array */ ... while(fgets(src_line,MAX_LINE_SIZE,fp_src_file) != NULL){ int tmp = 0; while(src_line[tmp] != '\0'){ if(src_line[tmp] == '\n'){ src_line[tmp] = '\0'; } tmp++; } strcpy(data[counter],src_line); counter++; }
Esta segfaults durante el strcpy. La mayoría de los recursos que he encontrado en línea que tratan con arreglos multidimensionales lo hacen con valores constantes. Estoy seguro de que esta probablemente no sea la mejor manera de hacerlo así que …
¡Gracias!
Como comenté anteriormente, no me queda claro si no está asignando la memoria correctamente para los datos, o si no la está asignando en absoluto 🙂 los datos son una característica **. Desea que sea una matriz de matrices de caracteres, por lo que necesita (a) asignar memoria para la matriz de nivel superior de caracteres * s, y luego (b) asignar memoria para las matrices de caracteres en sí.
Por lo tanto, si tiene un número desconocido de elementos, la solución más sencilla es encontrar un máximo razonable y asignar el máximo, o puede leer el archivo una vez solo buscando \ ns, cuéntelos y luego asigne memoria para datos apropiadamente, etc. O puede comenzar con una suposición sobre cuántas líneas va a tener, asigne los datos en consecuencia, y luego, cuando se quede sin espacio, cree una nueva matriz del doble de tamaño y copie todo . Eso suena como más trabajo del que quieres.
Otro enfoque que podría ser más sencillo: crear todo el archivo y crear un búfer lo suficientemente grande como para contener todo. Lea todo el archivo. Iterate, cambia las \ ns por \ 0s y cuenta las líneas a medida que avanzas. Luego cree un char ** de tamaño == el número de líneas que vio y asignelas al comienzo de cada línea. Voila – tienes una cadena por línea y no tienes que hacer tantas vueltas con la asignación de memoria.
Solo una pista sobre tu código existente; strcpy no le asigna realmente almacenamiento, necesita darle un búfer para copiar los datos.
data[counter] = malloc(strlen(src_line)+1); strcpy(data[counter],src_line);
Acerca de leer el archivo de una manera más elegante; ya que estás leyendo el archivo completo de todos modos;
De esa manera, tendrá todo el archivo asignado en un bloque (y liberado en un bloque) mientras tiene punteros a cada línea.