fopencookie(3) - wariua/manpages-ko GitHub Wiki

NAME

fopencookie - ๋งž์ถคํ˜• ์ŠคํŠธ๋ฆผ ์—ด๊ธฐ

SYNOPSIS

#define _GNU_SOURCE         /* feature_test_macros(7) ์ฐธ๊ณ  */
#include <stdio.h>

FILE *fopencookie(void *cookie, const char *mode,
                  cookie_io_functions_t io_funcs);

DESCRIPTION

fopencookie() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ‘œ์ค€ I/O ์ŠคํŠธ๋ฆผ์˜ ๋งž์ถคํ˜• ๊ตฌํ˜„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๊ตฌํ˜„์—์„œ๋Š” ์›ํ•˜๋Š” ์œ„์น˜์— ์ŠคํŠธ๋ฆผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฒ„ํผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ŠคํŠธ๋ฆผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” fmemopen(3)์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ fopencookie()๊ฐ€ ์“ฐ์ธ๋‹ค.

๋งž์ถคํ˜• ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค๋ ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋‹ค์Œ์„ ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • ์ŠคํŠธ๋ฆผ์— I/O๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ํ‘œ์ค€ I/O ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ๋Š” ๋„ค ๊ฐ€์ง€ "ํ›…" ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

  • "์ฟ ํ‚ค" ์ž๋ฃŒํ˜•์„ ์ •์˜ํ•œ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํ›… ํ•จ์ˆ˜๋“ค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด(๊ฐ€๋ น ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์— ์ €์žฅํ•˜๋Š”์ง€)๋ฅผ ๋‹ด๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ํ‘œ์ค€ I/O ํŒจํ‚ค์ง€๋Š” ์ด ์ฟ ํ‚ค์˜ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ (๊ทธ๋ž˜์„œ fopencookie()๋กœ ์ „๋‹ฌํ•  ๋•Œ void * ํƒ€์ž…) ํ›… ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ธฐ๊ณ„์ ์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ œ๊ณตํ•˜๊ธฐ๋งŒ ํ•œ๋‹ค.

  • fopencookie()๋ฅผ ํ˜ธ์ถœํ•ด ์ƒˆ ์ŠคํŠธ๋ฆผ์„ ์—ด๊ณ  ์ŠคํŠธ๋ฆผ์— ์ฟ ํ‚ค์™€ ํ›… ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ณ„ํ•œ๋‹ค.

fopencookie() ํ•จ์ˆ˜๋Š” fopen(3)๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์ฆ‰ ์ƒˆ ์ŠคํŠธ๋ฆผ์„ ์—ด๊ณ  ๊ทธ ์ŠคํŠธ๋ฆผ ์กฐ์ž‘ ์‹œ ์‚ฌ์šฉํ•  FILE ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

cookie ์ธ์ž๋Š” ํ˜ธ์ถœ์ž์˜ ์ฟ ํ‚ค ์ž๋ฃŒ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๋ฉฐ ์ƒˆ ์ŠคํŠธ๋ฆผ์— ์—ฐ๊ณ„๋œ๋‹ค. ํ‘œ์ค€ I/O ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์•„๋ž˜ ๊ธฐ์ˆ ํ•˜๋Š” ํ›… ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•  ๋•Œ ์ด ํฌ์ธํ„ฐ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ œ๊ณตํ•œ๋‹ค.

mode ์ธ์ž๋Š” fopen(3)์—์„œ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค. ์ง€์›ํ•˜๋Š” ๋ชจ๋“œ๋Š” r, w, a, r+, w+, a+์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ fopen(3)์„ ๋ณด๋ผ.

io_funcs ์ธ์ž๋Š” ์ŠคํŠธ๋ฆผ ๊ตฌํ˜„์„ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ •์˜ํ•œ ํ›… ํ•จ์ˆ˜๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•„๋“œ ๋„ค ๊ฐœ๊ฐ€ ๋‹ด๊ธด ๊ตฌ์กฐ์ฒด์ด๋‹ค. ์ด ๊ตฌ์กฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ผ ์žˆ๋‹ค.

typedef struct {
    cookie_read_function_t  *read;
    cookie_write_function_t *write;
    cookie_seek_function_t  *seek;
    cookie_close_function_t *close;
} cookie_io_functions_t;

๋„ค ํ•„๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

cookie_read_function_t *read

์ด ํ•จ์ˆ˜๋Š” ์ŠคํŠธ๋ฆผ์˜ ์ฝ๊ธฐ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ๋‹ค. ํ˜ธ์ถœ ์‹œ ์ธ์ž ์„ธ ๊ฐœ๋ฅผ ๋ฐ›๋Š”๋‹ค.

ssize_t read(void *cookie, char *buf, size_t size);

buf ์ธ์ž์™€ size ์ธ์ž๋Š” ๊ฐ๊ฐ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํผ์™€ ๊ทธ ๋ฒ„ํผ์˜ ํฌ๊ธฐ์ด๋‹ค. ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋กœ read ํ•จ์ˆ˜๋Š” buf๋กœ ๋ณต์‚ฌํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ, ๋˜๋Š” ํŒŒ์ผ ๋์ด๋ฉด 0์„, ๋˜๋Š” ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. read ํ•จ์ˆ˜๋Š” ์ŠคํŠธ๋ฆผ ์˜คํ”„์…‹์„ ์ ์ ˆํžˆ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

*read๊ฐ€ ๋„ ํฌ์ธํ„ฐ์ด๋ฉด ๋งž์ถคํ˜• ์ŠคํŠธ๋ฆผ ์ฝ๊ธฐ๊ฐ€ ํ•ญ์ƒ ํŒŒ์ผ ๋์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

cookie_write_function_t *write

์ด ํ•จ์ˆ˜๋Š” ์ŠคํŠธ๋ฆผ์˜ ์“ฐ๊ธฐ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ๋‹ค. ํ˜ธ์ถœ ์‹œ ์ธ์ž ์„ธ ๊ฐœ๋ฅผ ๋ฐ›๋Š”๋‹ค.

ssize_t write(void *cookie, const char *buf, size_t size);

buf ์ธ์ž์™€ size ์ธ์ž๋Š” ๊ฐ๊ฐ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ฒ„ํผ์™€ ๊ทธ ๋ฒ„ํผ์˜ ํฌ๊ธฐ์ด๋‹ค. ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋กœ write ํ•จ์ˆ˜๋Š” buf๋กœ๋ถ€ํ„ฐ ๋ณต์‚ฌํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ, ๋˜๋Š” ์˜ค๋ฅ˜ ์‹œ 0์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. (ํ•จ์ˆ˜๊ฐ€ ์Œ์ˆ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์„  ์•ˆ ๋œ๋‹ค.) write ํ•จ์ˆ˜๋Š” ์ŠคํŠธ๋ฆผ ์˜คํ”„์…‹์„ ์ ์ ˆํžˆ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

*write๊ฐ€ ๋„ ํฌ์ธํ„ฐ์ด๋ฉด ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ถœ๋ ฅ์ด ๋ฒ„๋ ค์ง„๋‹ค.

cookie_seek_function_t *seek

์ด ํ•จ์ˆ˜๋Š” ์ŠคํŠธ๋ฆผ์˜ ํƒ์ƒ‰ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ๋‹ค. ํ˜ธ์ถœ ์‹œ ์ธ์ž ์„ธ ๊ฐœ๋ฅผ ๋ฐ›๋Š”๋‹ค.

int seek(void *cookie, off64_t *offset, int whence);

*offset ์ธ์ž๋Š” ์ƒˆ ํŒŒ์ผ ์˜คํ”„์…‹์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, whence์— ๋‹ค์Œ ์ค‘ ์–ด๋А ๊ฐ’์ด ์žˆ๋А๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

SEEK_SET
์ŠคํŠธ๋ฆผ ์˜คํ”„์…‹์„ ์ŠคํŠธ๋ฆผ ์‹œ์ž‘์  ๊ธฐ์ค€ *offset ๋ฐ”์ดํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
SEEK_CUR
ํ˜„์žฌ ์ŠคํŠธ๋ฆผ ์˜คํ”„์…‹์— *offset์„ ๋”ํ•ด์•ผ ํ•œ๋‹ค.
SEEK_END
์ŠคํŠธ๋ฆผ ์˜คํ”„์…‹์„ ์ŠคํŠธ๋ฆผ ํฌ๊ธฐ ๋”ํ•˜๊ธฐ *offset์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ˜ํ™˜ ์ „์— seek ํ•จ์ˆ˜๋Š” ์ƒˆ ์ŠคํŠธ๋ฆผ ์˜คํ”„์…‹์„ ๋‚˜ํƒ€๋‚ด๋„๋ก *offset์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋กœ seek ํ•จ์ˆ˜๋Š” ์„ฑ๊ณต ์‹œ 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

*seek์ด ๋„ ํฌ์ธํ„ฐ์ด๋ฉด ์ŠคํŠธ๋ฆผ์—์„œ ํƒ์ƒ‰ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

cookie_close_function_t *close

์ด ํ•จ์ˆ˜๋Š” ์ŠคํŠธ๋ฆผ์„ ๋‹ซ๋Š”๋‹ค. ์ŠคํŠธ๋ฆผ์„ ์œ„ํ•ด ํ• ๋‹นํ–ˆ๋˜ ๋ฒ„ํผ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ์ผ์„ ํ›… ํ•จ์ˆ˜์—์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜ธ์ถœ ์‹œ ์ธ์ž ํ•œ ๊ฐœ๋ฅผ ๋ฐ›๋Š”๋‹ค.

int close(void *cookie);

cookie ์ธ์ž๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ fopencookie() ํ˜ธ์ถœ ์‹œ ์ œ๊ณตํ–ˆ๋˜ ์ฟ ํ‚ค์ด๋‹ค.

ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋กœ close ํ•จ์ˆ˜๋Š” ์„ฑ๊ณต ์‹œ 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์˜ค๋ฅ˜ ์‹œ EOF๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

*close๊ฐ€ NULL์ด๋ฉด ์ŠคํŠธ๋ฆผ์„ ๋‹ซ์„ ๋•Œ ๋ณ„๋‹ค๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ fopencookie()๋Š” ์ƒˆ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ATTRIBUTES

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ attributes(7)๋ฅผ ๋ณด๋ผ.

์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ฐ’
fopencookie() ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Safe

CONFORMING TO

์ด ํ•จ์ˆ˜๋Š” ๋น„ํ‘œ์ค€ GNU ํ™•์žฅ์ด๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” fmemopen(3)์„ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๊ณผ ๊ธฐ๋Šฅ์ด ๋น„์Šทํ•œ (ํ•˜์ง€๋งŒ ๋™์ผํ•˜์ง€๋Š” ์•Š์€) ๋งž์ถคํ˜• ์ŠคํŠธ๋ฆผ์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ŠคํŠธ๋ฆผ์„ ๊ตฌํ˜„ํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ช…๋ นํ–‰ ์ธ์ž๋“ค์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์จ๋„ฃ์€ ๋‹ค์Œ ์ŠคํŠธ๋ฆผ์„ ํƒ์ƒ‰ํ•˜๋ฉฐ ๋‹ค์„ฏ ๊ธ€์ž๋งˆ๋‹ค ๋‘ ๊ธ€์ž์”ฉ์„ ์ฝ์–ด์„œ ํ‘œ์ค€ ์ถœ๋ ฅ์— ์“ด๋‹ค. ๋‹ค์Œ ์…ธ ์„ธ์…˜์ด ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๋ณด์—ฌ ์ค€๋‹ค.

$ ./a.out 'hello world'
/he/
/ w/
/d/
Reached end of file

์ฐธ๊ณ ๋กœ ์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋” ๋ฒ”์šฉ์ ์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜ ์ƒํ™ฉ๋“ค(๊ฐ€๋ น ์ŠคํŠธ๋ฆผ ์—ฌ๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ์ฟ ํ‚ค๋กœ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ ์—ด๊ธฐ, ์ด๋ฏธ ๋‹ซํžŒ ์ŠคํŠธ๋ฆผ ๋‹ซ๊ธฐ)์„ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋„๋ก ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#define _GNU_SOURCE
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define INIT_BUF_SIZE 4

struct memfile_cookie {
    char   *buf;         /* ๋™์  ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ ๋ฒ„ํผ */
    size_t  allocated;   /* buf์˜ ํฌ๊ธฐ */
    size_t  endpos;      /* buf ๋‚ด์˜ ๋ฌธ์ž ๊ฐœ์ˆ˜ */
    off_t   offset;      /* buf ๋‚ด์˜ ํ˜„์žฌ ํŒŒ์ผ ์˜คํ”„์…‹ */
};

ssize_t
memfile_write(void *c, const char *buf, size_t size)
{
    char *new_buff;
    struct memfile_cookie *cookie = c;

    /* ๋ฒ„ํผ ๋ถ€์กฑ? ์ถฉ๋ถ„ํžˆ ์ปค์งˆ ๋•Œ๊นŒ์ง€ ๋‘ ๋ฐฐ์”ฉ ํ‚ค์šฐ๊ธฐ */

    while (size + cookie->offset > cookie->allocated) {
        new_buff = realloc(cookie->buf, cookie->allocated * 2);
        if (new_buff == NULL) {
            return -1;
        } else {
            cookie->allocated *= 2;
            cookie->buf = new_buff;
        }
    }

    memcpy(cookie->buf + cookie->offset, buf, size);

    cookie->offset += size;
    if (cookie->offset > cookie->endpos)
        cookie->endpos = cookie->offset;

    return size;
}

ssize_t
memfile_read(void *c, char *buf, size_t size)
{
    ssize_t xbytes;
    struct memfile_cookie *cookie = c;

    /* ์š”์ฒญ ๋ฐ”์ดํŠธ์™€ ๊ฐ€์šฉ ๋ฐ”์ดํŠธ ์ค‘ ์ž‘์€ ์ชฝ ๊ฐ€์ ธ์˜ค๊ธฐ */

    xbytes = size;
    if (cookie->offset + size > cookie->endpos)
        xbytes = cookie->endpos - cookie->offset;
    if (xbytes < 0)     /* offset์ด endpos๋ฅผ ์ง€๋‚ฌ์„ ์ˆ˜ ์žˆ์Œ */
        xbytes = 0;

    memcpy(buf, cookie->buf + cookie->offset, xbytes);

    cookie->offset += xbytes;
    return xbytes;
}

int
memfile_seek(void *c, off64_t *offset, int whence)
{
    off64_t new_offset;
    struct memfile_cookie *cookie = c;

    if (whence == SEEK_SET)
        new_offset = *offset;
    else if (whence == SEEK_END)
        new_offset = cookie->endpos + *offset;
    else if (whence == SEEK_CUR)
        new_offset = cookie->offset + *offset;
    else
        return -1;

    if (new_offset < 0)
        return -1;

    cookie->offset = new_offset;
    *offset = new_offset;
    return 0;
}

int
memfile_close(void *c)
{
    struct memfile_cookie *cookie = c;

    free(cookie->buf);
    cookie->allocated = 0;
    cookie->buf = NULL;

    return 0;
}

int
main(int argc, char *argv[])
{
    cookie_io_functions_t  memfile_func = {
        .read  = memfile_read,
        .write = memfile_write,
        .seek  = memfile_seek,
        .close = memfile_close
    };
    FILE *stream;
    struct memfile_cookie mycookie;
    ssize_t nread;
    long p;
    int j;
    char buf[1000];

    /* ์ฟ ํ‚ค ์ค€๋น„ํ•˜๊ณ  fopencookie() ํ˜ธ์ถœ */

    mycookie.buf = malloc(INIT_BUF_SIZE);
    if (mycookie.buf == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

    mycookie.allocated = INIT_BUF_SIZE;
    mycookie.offset = 0;
    mycookie.endpos = 0;

    stream = fopencookie(&mycookie,"w+", memfile_func);
    if (stream == NULL) {
        perror("fopencookie");
        exit(EXIT_FAILURE);
    }

    /* ๋ช…๋ นํ–‰ ์ธ์ž๋ฅผ ์šฐ๋ฆฌ ํŒŒ์ผ๋กœ ๊ธฐ๋ก */

    for (j = 1; j < argc; j++)
        if (fputs(argv[j], stream) == EOF) {
            perror("fputs");
            exit(EXIT_FAILURE);
        }

    /* EOF ์ „๊นŒ์ง€ ๋‹ค์„ฏ ๋ฐ”์ดํŠธ๋งˆ๋‹ค ๋‘ ๋ฐ”์ดํŠธ์”ฉ ์ฝ๊ธฐ */

    for (p = 0; ; p += 5) {
        if (fseek(stream, p, SEEK_SET) == -1) {
            perror("fseek");
            exit(EXIT_FAILURE);
        }
        nread = fread(buf, 1, 2, stream);
        if (nread == -1) {
            perror("fread");
            exit(EXIT_FAILURE);
        }
        if (nread == 0) {
            printf("Reached end of file\n");
            break;
        }

        printf("/%.*s/\n", nread, buf);
    }

    exit(EXIT_SUCCESS);
}

SEE ALSO

fclose(3), fmemopen(3), fopen(3), fseek(3)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ