C getline () – cómo tratar con buffers / cómo leer un número desconocido de valores en una matriz

En primer lugar, algunos antecedentes: estoy tratando de obtener una lista de enteros de un archivo externo y ponerlos en una matriz. Estoy usando getline para analizar el archivo de entrada línea por línea:

int lines = 0; size_t * inputBuffer = (size_t *) malloc(sizeof(size_t)); char * storage = NULL; 

Estoy llamando getline así:

 getline(&storage, &s, input) 

Escuché de la página man de getline que si proporciona un buffer size_t *, puede hacer que getline lo cambie de tamaño cuando exceda la asignación de bytes. Mi pregunta es, ¿para qué puedes usar este buffer? ¿Contendrá todos los elementos que lees con getline ()? ¿Es más fácil de leer desde este búfer o atravesar la entrada de una manera diferente al colocar estos enteros en una matriz? ¡Gracias!

El buffer solo contendrá la última línea que leas con getline . El propósito es solo tomar un poco del esfuerzo de administrar la memoria de su código.

Lo que sucederá si repetidamente llama a getline , pasando el mismo buffer repetidamente, es que el buffer se expandirá a la longitud de la línea más larga en su archivo y permanecerá allí. Cada llamada reemplazará su contenido con la línea siguiente.

No le está proporcionando un size_t* , le está dando un char* .

Este no es el uso correcto de getline . Recomiendo leer detenidamente su página de manual .

Podrías tener algún código como

 FILE *inputfile=fopen("yourinput.txt", "r"); size_t linesiz=0; char* linebuf=0; ssize_t linelen=0; while ((linelen=getline(&linebuf, &linesiz, inputfile)>0) { process_line(linebuf, linesiz); // etc free(linebuf); linebuf=NULL; } 

Por cierto, podrías (y probablemente deberías) poner

  free(linebuf); linebuf=NULL; 

… después del ciclo while (para mantener el buffer de línea asignado de una línea a la siguiente), y en la mayoría de los casos es preferible hacerlo (para evitar malloc -s demasiado frecuentes de getline ).

Observe que getline está en la extensión ISO / IEC TR 24731-2: 2010 (consulte n1248 ).