J'essaie de lire une ligne à la fois, de longueur arbitraire, depuis stdin sur la ligne de commande. Je ne suis pas sûr de pouvoir inclure GNU readline et préférerais utiliser une fonction de bibliothèque.
La documentation que j'ai lue suggère que getline
devrait fonctionner, mais dans mes expériences, il ne bloque pas. Mon exemple de programme:
#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;
}
produit No line
, ce qui le rend impropre à accepter les entrées utilisateur.
Comment puis-je faire cela? Je sais que cela devrait être trivial, mais je n'ai pas pu le comprendre.
Essayez ce patch
char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) {
-if (getline(&line, 0, stdin) == -1) {
printf("No line\n");
} else {
J'ai pu reproduire un comportement "non bloquant" sur 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...
blocs. Si j'affecte NULL
à buffer
, il bloque à nouveau (comme annoncé) et stocke la ligne dans un tampon nouvellement alloué.
Mais si j'écris
getline(NULL, &n, stdin);
alors getline
échoue, et semble ne pas bloquer. Un pointeur n
ou un fichier non valide pourrait également provoquer le même comportement. Serait-ce le problème?