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