名前空間
変種
操作

getline, getwline, getdelim, getwdelim

From cppreference.com
< C‎ | experimental‎ | dynamic
ヘッダー <stdio.h> で定義
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
(1) (動的メモリーTR)
ssize_t getwline(wchar_t **lineptr, size_t *n, FILE *stream);
(2) (動的メモリーTR)
ssize_t getdelim(char ** restrict lineptr, size_t * restrict n,
                 int delimiter, FILE *stream);
(3) (動的メモリーTR)
ssize_t getwdelim(wchar_t ** restrict lineptr, size_t * restrict n,
                 wint_t delimiter, FILE * stream);
(4) (動的メモリーTR)
1) getdelim(lineptr, n, '\n', stream) のように動作します。
2) getwdelim(lineptr, n, L'\n', stream) のように動作します。
3) ストリーム `stream` から `fgetc` を使って、`delimiter` が見つかるまで文字を読み込みます。読み込んだ文字は、サイズ `*n` のバッファ(`*lineptr` が指す)に格納され、バッファは入力全体(`delimiter` を含む)とヌル終端文字を格納できるように自動的に拡張されます(`realloc` のように)。`*lineptr` が `NULL` の場合、`*n` は無視され、`getline` は新しいバッファを割り当てます(`malloc` のように)。`delimiter` が `unsigned char` の範囲外、または `EOF` の場合、動作は未定義です。
4) (3) と同じですが、文字は `fgetwc` を使って読み込まれ、`delimiter` は有効な `wchar_t` または `WEOF` である必要があります。

もし `*lineptr` が `NULL` でない場合、`*lineptr` が `free` に渡せるポインタでない、または `*n` が `*lineptr` が指す割り当て済みメモリのサイズより小さい場合、動作は未定義です。

Dynamic Memory TR のすべての関数と同様に、`getline` が利用可能であるためには、実装によって `__STDC_ALLOC_LIB__` が定義され、ユーザーが `stdio.h` をインクルードする前に `__STDC_WANT_LIB_EXT2__` を整数定数 `1` として定義する必要があります。

目次

[編集] パラメータ

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

[編集] 戻り値

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

エラーが発生した場合、`-1` を返し、`stream` に対して `feof` または `ferror` を設定します。

[編集] 注記

これらの関数は、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:

[編集] 関連項目

ファイルストリームから文字列を取得する
(関数) [編集]
(C11で削除)(C11)
stdinから文字列を読み込む
(関数) [編集]
(C95)
ファイルストリームからワイド文字列を取得する
(関数) [編集]
メモリを割り当てる
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)