Lectura de valores de un archivo y almacenamiento en una matriz multidimensional

Soy nuevo en C, así que avísame si ves algo estúpido por mi parte 🙂

Lo que estoy tratando de hacer

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 …

Mis preguntas

  1. ¿Hay una mejor manera de lograr lo que estoy tratando de hacer?
  2. ¿Cuál es la forma correcta de obtener un número desconocido de elementos en una matriz multidimensional? ¿Debería incluso estar haciendo esto?

¡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;

  • fstat el archivo para obtener el tamaño y el tamaño del archivo malloc + 1. Establezca fileBuffer [tamaño] en 0.
  • lea el archivo completo con una llamada de “lectura” en su bloque malloc’d.
  • Reemplace todos \ n con \ 0 en su bloque mientras cuenta el número de nuevas líneas.
  • Asigne una matriz de punteros de línea del tamaño correcto (es decir, número de líneas nuevas + 1 si el archivo no termina con una línea nueva)
  • Recorra el archivo y establezca punteros consecutivos en la matriz a la primera dirección de memoria después de \ 0 (la primera línea es un caso especial y apunta directamente a su bloque malloc’d)

De esa manera, tendrá todo el archivo asignado en un bloque (y liberado en un bloque) mientras tiene punteros a cada línea.