leyendo un archivo a una matriz de cadenas

Soy nuevo en C y solo estoy aprendiendo sobre malloc y realloc y la ayuda de la comunidad para entender cómo hacerlo. Tengo un archivo con párrafos que necesito leer línea por línea y almacenar las líneas en series o cadenas al crear las matrices dinámicamente.

Inicialmente, el número MÁXIMO de líneas para almacenar es 10 si esto no es suficiente, usamos realloc para duplicar la memoria e imprimir un mensaje que indica que hemos reasignado la memoria. Hasta ahora esto es lo que tengo y necesito ayuda para terminar.

int main(int argc, char* argv[]) { char* p = malloc(10* sizeof(char)); while(buffer, sizeof(buffer), stdin) { } } 

while(buffer, ... no hace nada, usa fgets :

data.txt:

 one two three 

 #include  #include  #include  #define BUF_LEN 32 extern char *strdup(const char *); int main(void) { char **arr = NULL; char buf[BUF_LEN]; size_t i, n = 0; FILE *f; f = fopen("data.txt", "r"); if (f == NULL) { perror("fopen"); exit(EXIT_FAILURE); } while (fgets(buf, BUF_LEN, f)) { arr = realloc(arr, sizeof(*arr) * (n + 1)); if (arr == NULL) { perror("realloc"); exit(EXIT_FAILURE); } arr[n] = strdup(buf); if (arr[n++] == NULL) { perror("strdup"); exit(EXIT_FAILURE); } } for (i = 0; i < n; i++) { printf("%s", arr[i]); free(arr[i]); } free(arr); } 

Dijiste y necesitas una serie de cadenas. Ahora que lo pienso, una cadena es una secuencia / matriz de caracteres, ¿verdad? Así que necesitas una matriz de caracteres.

Ahora, un char * es capaz de señalar a un personaje e indirectamente a los siguientes, si hay alguno. Esto es lo que llamamos como una cadena, y aquí es cómo tenemos uno:

 char * astring = malloc( 256 * sizeof * astring ); // astring holds an adress pointing to a memory location // which has the capacity of 256 *astring s // astring is a string tha can hold 255 characters // with the full-stop '\0' at the end 

Ahora quieres 10 de tales, 10 de caracteres. char ** podrá señalarlos, al igual que char * can en char s.

 char ** lines = malloc( 10 * sizeof * lines ); for ( int i = 0; i < 10; i++ ) lines[i] = malloc( 256 ); // sizeof may be omittid for chars 

Si planea boost 10, es una buena idea almacenar eso dentro de una variable, duplicarlo cuando sea necesario y reasignarlo en consecuencia.

 int numlines = 10; int linelength = 256; char ** lines = malloc( numlines * sizeof * lines ); for( int linenr = 0; fgets( lines[linenr] = malloc( linelength ), linelength, yourfile ) != EOF; linenr++ ) { if ( linenr + 1 == numlines ) { numlines *= 2; lines = realloc( lines, numlines * sizeof * lines ); } } 

Incluya los encabezados necesarios, complete los huecos y haga verificaciones si las asignaciones y los fopen realizaron fopen , asegúrese de que 256 sea suficiente, auméntelos si es necesario. Opcionalmente, también puedes hacer eso adaptable, pero eso requerirá más código.