getline(3) - wariua/manpages-ko GitHub Wiki
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
- glibc 2.10 ์ :
_GNU_SOURCE
getline()
์ stream
์ผ๋ก๋ถํฐ ํ ํ๋๋ฅผ ํต์งธ๋ก ์ฝ์ด์ ๊ทธ ํ
์คํธ๋ฅผ ๋ด์ ๋ฒํผ์ ์ฃผ์๋ฅผ *lineptr
์ ์ ์ฅํ๋ค. ๊ทธ ๋ฒํผ๋ ๋๋ก ๋๋๋ฉฐ ๊ฐํ ๋ฌธ์๊ฐ ์์ผ๋ฉด ๊ทธ๋๋ก ํฌํจํ๋ค.
ํธ์ถ ์ ์ *lineptr
์ด NULL๋ก ์ค์ ๋์ด ์๊ณ *n
์ด 0์ผ๋ก ์ค์ ๋์ด ์์ผ๋ฉด ํ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฒํผ๋ฅผ getline()
์์ ํ ๋นํ๊ฒ ๋๋ค. ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์์ ์ด ๋ฒํผ๋ฅผ ํด์ ํด์ผ ํ๋๋ฐ, getline()
์ด ์คํจํ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
๊ทธ๋ ์ง ์๊ณ getline()
ํธ์ถ ์ ์ *lineptr
์ด malloc(3)์ผ๋ก ํ ๋นํ *n
๋ฐ์ดํธ ํฌ๊ธฐ ๋ฒํผ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ด๊ณ ์์ ์ ์๋ค. ๊ทธ ๋ฒํผ๊ฐ ํ์ ๋ด๊ธฐ์ ์ถฉ๋ถํ ํฌ์ง ์์ผ๋ฉด getline()
์์ realloc(3)์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ณ *lineptr
๊ณผ *n
์ ์ ์ ํ ๊ฐฑ์ ํ๋ค.
์ด๋ ๊ฒฝ์ฐ์๋ ํธ์ถ ์ฑ๊ณต ์์ *lineptr
๊ณผ *n
์ด ๊ฐ๊ฐ ๋ฒํผ ์ฃผ์์ ํ ๋น ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋๋ก ๊ฐฑ์ ๋๋ค.
getdelim()
์ getline()
์ฒ๋ผ ๋์ํ๋ delimiter
์ธ์๋ก ๊ฐํ ์ธ์ ํ ๊ตฌ๋ถ์๋ฅผ ์ง์ ํ ์ ์๋ค. getline()
์์์ฒ๋ผ ์
๋ ฅ์ ๊ตฌ๋ถ์ ๋ฌธ์ ์์ด ํ์ผ ๋์ ๋๋ฌํ์ผ๋ฉด ๊ตฌ๋ถ์ ๋ฌธ์๊ฐ ๋ฒํผ์ ์ถ๊ฐ๋์ง ์๋๋ค.
์ฑ๊ณต ์ getline()
๊ณผ getdelim()
์ ์ฝ์ ๋ฌธ์ ์๋ฅผ ๋ฐํํ๋๋ฐ, ๊ตฌ๋ฌธ ๋ฌธ์๋ ํฌํจํ๊ณ ์ข
๋ฃ์ฉ ๋ ๋ฐ์ดํธ('\0'
)๋ ์ ์ธํ๋ค. ์ด ๊ฐ์ ์ด์ฉํ๋ฉด ์ฝ์ ํ์ ๋ ๋ฐ์ดํธ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
๋ ํจ์ ๋ชจ๋ ํ์ ์ฝ๋ ๋ฐ ์คํจํ๋ฉด (ํ์ผ ๋ ์ํ ํฌํจ) -1์ ๋ฐํํ๋ค. ์ค๋ฅ ๋ฐ์ ์ ์ค๋ฅ ์์ธ์ ๋ํ๋ด๋๋ก errno
๋ฅผ ์ค์ ํ๋ค.
EINVAL
- ์๋ชป๋ ์ธ์. (
n
์ด๋lineptr
์ด NULL์ด๊ฑฐ๋,stream
์ด ์ ํจํ์ง ์์.) ENOMEM
- ํ ๋ฒํผ ํ ๋น ๋ด์ง ์ฌํ ๋น ์คํจ.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
getline() , getdelim()
|
์ค๋ ๋ ์์ ์ฑ | 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 %zu:\n", nread);
fwrite(line, nread, 1, stdout);
}
free(line);
fclose(stream);
exit(EXIT_SUCCESS);
}
read(2)
, fgets(3), fopen(3), fread(3)
, scanf(3)
2019-03-06