#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():
*lineptr が NULL にセットされ、 *n が呼び出し前に 0 にセットされた場合、 getline() は行の内容を格納するためのバッファーを確保する。 このバッファーは、 getline() が失敗した場合であっても、ユーザーのプログラムで解放すべきである。
別の方法として、 getline() を呼び出す際に、 *lineptr に malloc(3) で確保した大きさ *n バイトのバッファーへのポインターを入れて渡すこともできる。 読み込んだ行を保持するのに十分なバッファーがない場合、 getline() は realloc(3) を使ってバッファーのサイズを変更し、必要に応じて *lineptr と *n を更新する。
どちらの場合でも、呼び出しに成功したときには、 *lineptr と *n がバッファーのアドレスと割り当てたサイズを反映した値に更新される。
getdelim() は getline() と同じように動作するが、改行文字以外の区切り文字を引数 delim に指定することができる。 getline() と同様に、ファイル終端に達するまでに入力行に区切り文字が見付からない場合は、 区切り文字をバッファーに追加しない。
どちらの関数も、行の読み込みに失敗した場合には -1 を返す (ファイルの終端に達した場合にも -1 を返す)。 エラーが発生した場合には、 errno にエラーの原因を示す値が設定される。
インターフェース | 属性 | 値 |
getline(), getdelim() | Thread safety | MT-Safe |
int
main(int argc, char *argv[])
{
FILE *stream;
char *line = NULL;
size_t len = 0;
ssize_t nread;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
stream = fopen(argv[1], "r");
if (stream == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
while ((nread = getline(&line, &len, stream)) != -1) {
printf("Retrieved line of length %zd:\n", nread);
fwrite(line, nread, 1, stdout);
}
free(line);
fclose(stream);
exit(EXIT_SUCCESS);
}