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);
getline(),
getdelim():
- glibc 2.10 以降:
- _POSIX_C_SOURCE >= 200809L
- glibc 2.10 より前:
- _GNU_SOURCE
getline() は
stream から 1
行全てを読み込み、テキストが含まれているバッファーのアドレスを
*lineptr に格納する。
バッファーはヌル文字
(\0) で終端される。
改行文字が見つかった場合は、改行文字もバッファーに格納される。
*lineptr が NULL
にセットされ、
*n
が呼び出し前に 0
にセットされた場合、
getline()
は行の内容を格納するためのバッファーを確保する。
このバッファーは、
getline()
が失敗した場合であっても、ユーザーのプログラムで解放すべきである。
別の方法として、
getline()
を呼び出す際に、
*lineptr に
malloc(3)
で確保した大きさ
*n
バイトのバッファーへのポインターを入れて渡すこともできる。
読み込んだ行を保持するのに十分なバッファーがない場合、
getline() は
realloc(3)
を使ってバッファーのサイズを変更し、必要に応じて
*lineptr と
*n
を更新する。
どちらの場合でも、呼び出しに成功したときには、
*lineptr と
*n
がバッファーのアドレスと割り当てたサイズを反映した値に更新される。
getdelim() は
getline()
と同じように動作するが、改行文字以外の区切り文字を引数
delim
に指定することができる。
getline()
と同様に、ファイル終端に達するまでに入力行に区切り文字が見付からない場合は、
区切り文字をバッファーに追加しない。
成功した場合、
getline()
と
getdelim()
は読み込んだ文字数を返す。
文字数には区切り文字は含まれるが、終端に使うヌルバイト
('\0') は含まれない。
この値によって、読み込んだ行に含まれるヌルバイトを操作することができる。
どちらの関数も、行の読み込みに失敗した場合には
-1 を返す
(ファイルの終端に達した場合にも
-1 を返す)。
エラーが発生した場合には、
errno
にエラーの原因を示す値が設定される。
- EINVAL
- 引数が不正である
( n または lineptr が NULL
である。 もしくは
stream
が有効でない)。
- ENOMEM
- Allocation or reallocation of the line buffer failed.
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
getline(), getdelim() |
Thread safety |
MT-Safe |
getline() と
getdelim()
は、どちらも元は GNU
による拡張であったが、
POSIX.1-2008 で標準化された。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
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);
}
read(2),
fgets(3),
fopen(3),
fread(3),
scanf(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。