名前空間
変種
操作

getline, getwline, getdelim, getwdelim

提供: cppreference.com
< c‎ | experimental‎ | dynamic
ヘッダ <stdio.h> で定義
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
(1) (dynamic memory TR)
ssize_t getwline(wchar_t **lineptr, size_t *n, FILE *stream);
(2) (dynamic memory TR)
ssize_t getdelim(char ** restrict lineptr, size_t * restrict n,
                 int delimiter, FILE *stream);
(3) (dynamic memory TR)
ssize_t getwdelim(wchar_t ** restrict lineptr, size_t * restrict n,
                 wint_t delimiter, FILE * stream);
(4) (dynamic memory TR)
1) getdelim(lineptr, n, '\n', stream) のように動作します。
2) getwdelim(lineptr, n, L'\n', stream) のように動作します。
3) fgetc によって行われたかのように、 delimiter に遭遇するまでストリーム stream から読み込み、その文字を *lineptr の指すサイズ *n のバッファに格納し、ヌル文字を追加します。 入力全体が収まるよう、 realloc によって行われたかのように自動的にバッファのサイズを増加させます。 *lineptr はヌルでも構いません。 その場合、 *n は無視され、 getlinemalloc によって行われたかのように新しいバッファを確保します。 delimiterunsigned char の範囲外であり EOF でない値を持つ場合、動作は未定義です。
4) (3) と同じですが、文字は fgetwc によって行われたかのように読み込まれ、 delimiter は有効な wchar_t または WEOF でなければなりません。

*lineptr がヌルでない場合、 *lineptrfree に渡すことのできるポインタでないか、 *n*lineptr の指す確保済みメモリのサイズより小さければ、動作は未定義です。

Dynamic Memory TR のすべての関数と同様に、 getline は処理系によって __STDC_ALLOC_LIB__ が定義されており、 stdio.h をインクルードする前にユーザが __STDC_WANT_LIB_EXT2__ を整数定数 1 に定義する場合にのみ、利用可能であることが保証されます。

目次

[編集] 引数

lineptr - 初期バッファまたはヌルポインタを指すポインタ
n - 初期バッファのサイズを指すポインタ
delimiter - 区切り文字
stream - fopen によって開かれた有効な入力ストリーム

[編集] 戻り値

区切り文字を含み、ヌル終端を除く、バッファに格納された文字数。

エラーの場合は、 -1 を返し、 streamfeof または ferror を設定します。

[編集] ノート

これらの関数はその POSIX 版と同一です。 ただし、 POSIX 版はエラーの場合に errno を設定することが許されてはいますが、要求されてはいません。

[編集]

#ifdef __STDC_ALLOC_LIB__
#define __STDC_WANT_LIB_EXT2__ 1
#else
#define _POSIX_C_SOURCE 200809L
#endif
 
#include <stdio.h>
#include <stdlib.h>
void get_y_or_n(void)
{
    char *response = NULL;
    size_t len;
    printf("Continue? [y] n: ");
    if((getline(&response, &len, stdin) < 0) || (len && response[0] == 'n')) {
        free(response);
        exit(0);
    }
    free(response);
    return;
}
int main(void) 
{
    get_y_or_n();
}

出力:

Continue? [y] n:

[編集] 関連項目

ファイルストリームから文字列を取得します
(関数) [edit]
(C11で削除)(C11)
stdin から文字列を読み込みます
(関数) [edit]
(C95)
ファイルストリームからワイド文字列を取得します
(関数) [edit]
メモリを確保します
(関数) [edit]