GETLINE(3)

名前
getline, getdelim - 区切り文字までの文字列入力を読み込む

書式
#include <stdio.h>

ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

getline(), getdelim():
    glibc 2.10 以降:
        _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
    glibc 2.10 より前:
        _GNU_SOURCE

説明
getline() は stream から 1 行全てを読み込み、テキストが含まれているバッファのアドレスを *lineptr に格納する。 バッファはヌル文字 (\0) で終端される。 改行文字が見つかった場合は、改行文字もバッファに格納される。 *lineptr が NULL の場合、 getline() は行の内容を格納するためのバッファを確保する。 このバッファはユーザーのプログラムで解放すべきである (この場合、 *n の値は無視される)。 別の方法として、 getline() を呼び出す際に、 *lineptr に malloc(3) で確保した大きさ *n バイトのバッファへのポインタを入れて渡すこともできる。 読み込んだ行を保持するのに十分なバッファがない場合、 getline() は realloc(3) を使ってバッファのサイズを変更し、必要に応じて *lineptr と *n を更新する。 どちらの場合でも、呼び出しに成功したときには、 *lineptr と *n がバッファのアドレスと割り当てたサイズを反映した値に更新される。 getdelim() は getline() と同じように動作するが、改行文字以外の区切り文字を引き数 delim に指定することができる。 getline() と同様に、ファイル終端に達するまでに入力行に区切り文字が見付からない場合は、 区切り文字をバッファに追加しない。

返り値
成功した場合、 getline() と getdelim() は読み込んだ文字数を返す。 文字数には区切り文字は含まれるが、終端に使う NULL バイト ('\0') は含まれない。 この値によって、読み込んだ行に含まれる NULL バイトを操作することができる。 どちらの関数も、行の読み込みに失敗した場合には -1 を返す (ファイルの終端に達した場合にも -1 を返す)。 エラーが発生した場合には、 errno にエラーの原因を示す値が設定される。

エラー

EINVAL
    引き数が不正である (n または lineptr が NULL である。 もしくは stream が有効でない)。

バージョン
これらの関数は libc 4.6.27 以降で利用可能である。

準拠
getline() と getdelim() は、どちらも元は GNU による拡張であったが、 POSIX.1-2008 で標準化された。

例
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
    FILE *fp;
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    fp = fopen("/etc/motd", "r");
    if (fp == NULL)
        exit(EXIT_FAILURE);
    while ((read = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu :\n", read);
        printf("%s", line);
    }
    free(line);
    exit(EXIT_SUCCESS);
}

関連項目
read(2), fgets(3), fopen(3), fread(3), gets(3), scanf(3)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。