2012-09-03 14 views
26

Estoy tratando de leer una línea a la vez, de longitud arbitraria, desde stdin en la línea de comandos. No estoy seguro de si podré incluir la línea de lectura de GNU y preferiría usar una función de biblioteca.¿Cómo leer una línea de stdin, bloqueando hasta que se encuentre la nueva línea?

La documentación que he leído sugiere que getline debería funcionar, pero en mis experimentos no bloquea. Mi programa de ejemplo:

#include <stdio.h> 
int main() 
{ 
    char *line = NULL; 
    if (getline(&line, NULL, stdin) == -1) { 
     printf("No line\n"); 
    } else { 
     printf("%s\n", line); 
    } 
    return 0; 
} 

produce No line, lo que lo hace inadecuado para aceptar la entrada del usuario.

¿Cómo puedo hacer esto? Sé que debería ser trivial, pero no he sido capaz de resolverlo.

+1

'getline()' * does * block (recién probado en 'stdin'). ¿Puedes publicar código de muestra? – LSerni

+1

Posible duplicado de [Cómo leer una línea de la consola en C] (http://stackoverflow.com/questions/314401/how-to-read-a-line-from-the-console-in-c) –

Respuesta

44

probar este parche

char *line = NULL; 
+size_t size; 
+if (getline(&line, &size, stdin) == -1) { 
-if (getline(&line, 0, stdin) == -1) { 
    printf("No line\n"); 
} else { 
+3

Esto lo resuelve. Y me doy cuenta de mi error; Leí mal la documentación y pensé que 'n' era un' size_t' en lugar de 'size_t *'. ¡Gracias! – Taymon

+32

Me gusta mucho el estilo de control de versiones del código en esta respuesta. – whirlwin

+2

¿Hay alguna explicación de por qué esto funciona? Supuse que como la documentación dice que el tamaño se ignora cuando la línea es un puntero nulo, también puedo pasar un puntero nulo al tamaño. –

4

he sido capaz de reproducir un comportamiento "sin bloqueo" en la getline:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
     char *buffer; 
     size_t n = 1024; 
     buffer = malloc(n); 
     return getline(&buffer, &n, stdin); 
} 

getline(&buffer... bloques. Si asigno NULL a buffer, nuevamente bloquea (como se anuncia) y almacena la línea en un búfer recién asignado.

Pero si escribo

getline(NULL, &n, stdin); 

continuación getline falla, y parece no bloquear. Probablemente también un n no válido o puntero de archivo podría causar el mismo comportamiento. ¿Podría ser este el problema?

Cuestiones relacionadas