web-dev-qa-db-ja.com

改行が見つかるまでブロックして、stdinから行を読み取る方法は?

コマンドラインの標準入力から、任意の長さの行を一度に1つずつ読み取ろうとしています。 GNU readlineを含めることができ、ライブラリ関数を使用することを好むかどうかはわかりません。

私が読んだドキュメントでは、getlineは機能するはずですが、私の実験ではブロックしません。私のサンプルプログラム:

#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;
}

No line。これは、ユーザー入力の受け入れに適さないものにします。

どうすればいいですか?私はそれが些細なものであるべきだと知っていますが、私はそれを理解することができませんでした。

30
Taymon

このパッチを試してください

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

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...ブロック。 NULLbufferを割り当てると、再び(アドバタイズされたように)ブロックされ、新しく割り当てられたバッファーに行が格納されます。

しかし、私が書いたら

getline(NULL, &n, stdin);

getlineは失敗し、seemsはブロックしません。おそらく、無効なnまたはファイルポインターも同じ動作を引き起こす可能性があります。これが問題なのでしょうか?

5
LSerni