Namespaces
Variants

getline, getwline, getdelim, getwdelim

From cppreference.net
ヘッダーで定義 <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 関数と同様の動作をします getwdelim ( lineptr, n, L ' \n ' , stream )
3) ストリーム stream から fgetc によって読み取るように、 delimiter に遭遇するまで読み取り、 *lineptr が指すサイズ *n のバッファに文字を格納し、 realloc によって自動的にサイズを増加させて、区切り文字を含む入力全体に適合させ、ヌル終端文字を追加する。 realloc によって返されたポインタは *lineptr に書き戻される。 *lineptr が null の場合、以前の *n の値は無視され、 getline malloc によって新しいバッファを割り当てる。いずれの場合も、割り当てられたバッファの最終的な長さは *n に書き込まれる。 delimiter の値が unsigned char の範囲外または EOF の場合、動作は未定義である。
4) (3) と同様だが、文字は fgetwc によって読み込まれるかのように扱われ、 delimiter は有効な wchar_t または WEOF でなければならない。

*lineptr がnullでない場合、 *lineptr free に渡すことができるポインタでないか、 *n *lineptr が指す割り当てられたメモリのサイズより大きい場合、動作は未定義です。また、 n size_t 型の値を書き込むのに適した有効なポインタでない場合も動作は未定義です。

Dynamic Memory TRのすべての関数と同様に、 getline は、実装によって __STDC_ALLOC_LIB__ が定義され、かつユーザーが __STDC_WANT_LIB_EXT2__ を整数定数 1 に定義した場合にのみ利用可能であることが保証されます。

目次

パラメータ

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

戻り値

バッファに格納されている文字数。区切り文字を含みますが、null終端文字は含みません。

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

注記

これらの関数は、 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)
ファイルストリームからワイド文字列を取得する
(関数)
メモリを割り当てる
(関数)