Contents

System Programming Ch5

   Oct 21, 2022     3 min read

๐Ÿ’กย Chap_5

Stream Orientation

#include <stdio.h>
#include <wchar.h>
int fwide(FILE *fp, int mode);

wchar.h : singlebyte๋ฅผ ์“ธ์ง€ multibyte๋ฅผ ์“ธ์ง€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”

singlebyte : 1 byte (8bit)๋กœ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ ๊ฐ€๋Šฅ ํ•œ ๋ฌธ์ž โ‡’ ASCII ์ฝ”๋“œ

multibyte : ํ•œ๊ธ€์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ์ตœ์†Œ 2๋ฐ”์ดํŠธ๊ฐ€ ํ•„์š”ํ•จ, ์ด๋•Œ ์“ฐ๋Š” ๊ฒƒ

fwide : ํŒŒ์ผ์„ ์—ฌ๋Š” ์ˆœ๊ฐ„ ์ฝ์„๊ฑด์ง€ ์“ธ๊ฑด์ง€ ๊ฒฐ์ •ํ•˜๋Š” stream(ํ†ต๋กœ)์ด ์ƒ๊น€, ๊ทธ ์ŠคํŠธ๋ฆผ์˜ ์†์„ฑ, ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•ด ์คŒ, singlebyte๋กœ ์“ธ๊ฑด์ง€ multibyte๋กœ ์“ธ๊ฑด์ง€ ๊ฒฐ์ •


Buffering

#include <stdio.h>
void setbuf(FILE *fp, char *buf);
int setvbuf(FILE *fp, char *buf, int mode, size_t size);

setbuf

  • ๋ฒ„ํผ์˜ ์‚ฌ์šฉ์—ฌ๋ถ€/ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜
  • char *buf ์ธ์ž์— null์„ ๋„ฃ์œผ๋ฉด ๋ฒ„ํผ๋ง์„ ์•ˆํ•จ โ‡’ ๋ฒ„ํผ๋ง์„ ํ• ์ง€ ๋ง์ง€๋„ ๊ฒฐ์ •ํ•จ
  • ์‚ฌ์šฉ์ž ์ง€์ • ๋ฒ„ํผ๋ง

setvbuf

  • ์ธ์ž์™€ ๋ชจ๋“œ๊ฐ€ ๋‹ค๋ฆ„
  • mode : _IOFBF, _IOLBF, _IONBF
  • ๋ชจ๋“œ๋Š” ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ, ์‹œ์Šคํ…œ์—์„œ ์ •์˜๋œ ๋ชจ๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ์”€

fflush

#include <stdio.h>
int fflush(FILE *fp);
// A stream or all output streams, if fp is NULL, are flushed
  • ๋ฒ„ํผ์— ์žˆ๋Š” ๊ฒƒ์„ ๋‹ค ๋‚ ๋ฆผ
  • input stream์—๋„ ์“ธ ์ˆ˜ ์žˆ์Œ
  • ๊ทผ๋ฐ ๋ณดํ†ต output์— ์žˆ๋Š” ๊ฒƒ๋งŒ ๋‚ ๋ฆผ
  • ์ธํ’‹์€ ์‚ฌ์šฉ์ž์ž…๋ ฅ์ด๋ฏ€๋กœ ์˜ค๋ฆฌ์ง€๋„ ์ •๋ณด๊ฐ€ ํ›ผ์†๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ž˜ flushํ•˜์ง€ ์•Š์Œ
  • ์•„์›ƒํ’‹์— ์žˆ๋Š” ๊ฒƒ์€ ๋ชจ์ข…์˜ ์ด์œ ๊ฐ€ ์žˆ์–ด์„œ ์•„์›ƒํ’‹์ด ์•ˆ๋œ ๊ฒƒ, ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋‚ ๋ฆผ


Opening a Stream

fopen : ํŒŒ์ผ์„ ์—ฌ๋Š” ํ•จ์ˆ˜

freopen : ํŒŒ์ผ์„ ๋‹ค์‹œ ์—ฌ๋Š” ํ•จ์ˆ˜

fdopen : fopen๊ณผ ๋™์ผํ•œ ๋™์ž‘, pipe์™€ network์˜ ๊ด€๋ จ๋œ ์ฑ„๋„์—์„œ ์‚ฌ์šฉ๋จ

fclose

  • ์•„์›ƒํ’‹ ๋ฒ„ํผ๋ฅผ flush๋กœ ๋‹ค ์ง€์šฐ๋ฉด์„œ ํ• ๋‹น๋˜์–ด์žˆ๋˜ ๋ฒ„ํผ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • ๋‹ซ๋Š”๋‹ค๋Š” ํ‚ค์›Œ๋“œ ์—†์ด fclose๋ฅผ ๋ฌผ์–ด๋ณผ ์ˆ˜๋„ ์žˆ์Œ


Reading and Writing a Stream

getc

  • get character, ๋ฌธ์ž๋ฅผ ๊ฐ€์ ธ์˜ด
  • ๋ฉ”ํฌ๋กœ์ฒ˜๋Ÿผ ๋™์ž‘

fgetc

  • char๋ฅผ ์ฝ์–ด์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ต fgetc๋กœ ํ†ต์ผ (fgetc๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ์—์„œ getc๊ฐ€ ๋™์ž‘๋จ)
  • ์‚ฌ์šฉ์ž๋“ค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ํ•จ์ˆ˜

getchar

  • getc(stdin)๊ณผ ๊ฐ™์Œ, ์ธ์ž๊ฐ€ ํ•„์š”์—†์Œ, ์ธ์ž๊ฐ€ stdin(ํ‘œ์ค€์ž…๋ ฅ 0)์œผ๋กœ ๊ณ ์ •

ํ‚ค๋ณด๋“œ๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›๋Š” ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ด๊ฒ ๋‹ค โ‡’ getchar

ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ํ•œ๋ฌธ์ž์”ฉ ์ฝ์–ด๋“ค์ด๊ฒ ๋‹ค โ‡’ fgetc

ferror

  • getc์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ์ค‘๊ฐ„์— ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”์ง€, ํŒŒ์ผ์˜ ๋์ธ์ง€ ํ™•์ธ์ด ์•ˆ๋จ
  • ์ด๋•Œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ํ•จ์ˆ˜

feof

  • ferror๊ณผ ๊ฐ™์€ ๋™์ž‘

clearer

ungetc

  • ์ฝ์–ด์˜ค๋Š” ์ŠคํŠธ๋ฆผ
  • ์ฝ์–ด์˜ค๋Š” queue, ๊ทธ ๋ฒ„ํผ์— ๋‹ค์‹œ ๋„ฃ์–ด์คŒ
  • ๋ฌธ์ž๋ฅผ ์ฝ๊ณ ๋‚˜์„œ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋„๋กœ ๋ฐ˜ํ™˜

putc

  • char ์“ฐ๊ธฐ(์ถœ๋ ฅ)

fputc

  • ์•ˆ์—์„œ putc ํ˜ธ์ถœ

putchar

  • stdout, ํ‘œ์ค€์ถœ๋ ฅ(1)์„ ์ธ์ž๋กœ
  • ๋ชจ๋‹ˆํ„ฐ์— ๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ณ ์ •


Line-at-a-Time I/O

fgets

  • ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ์“ฐ๋Š” ํ•จ์ˆ˜

gets

  • ์–ผ๋งˆ๋งŒํผ์˜ ์–‘์„ ๋ฐ›์•„์˜ฌ ์ง€ ์ธ์ž๋กœ ๋ฐ›์ง€ ์•Š์Œ
  • ๋”ฐ๋ผ์„œ ์ทจ์•ฝํ•˜๋ฏ€๋กœ fgets๋ฅผ ์”€

fputs

  • put string, ๋ฌธ์ž์—ด์„ ์“ธ(์ถœ๋ ฅํ• ) ๋•Œ ์“ฐ๋Š” ํ•จ์ˆ˜

puts

  • fputs์™€ ๊ฐ™์€ ๋™์ž‘
  • ์ž๋™ ์ค„๋ฐ”๊ฟˆ์ด ๋จ


Binary I/O

fread, fwrite

  • ๊ณ ์ˆ˜์ค€์˜ ์ž…์ถœ๋ ฅ
  • ๊ณ ์ˆ˜์ค€ ์ž…์ถœ๋ ฅํ•จ์ˆ˜๋“ค์€ unbuffered์˜ ๋ฐ˜๋Œ€, buffered๋ฅผ ํ•จ


Positioning a Stream

ftell

  • ํ•œ char์”ฉ ์ฝ์–ด๊ฐ(getc๋กœ), ๊ทธ๋•Œ ํฌ์ธํ„ฐ๊ฐ€ ํ•˜๋‚˜์”ฉ ์›€์ง์ž„
  • ์ด๋•Œ ์ด ํฌ์ธํ„ฐ๊ฐ€ ์–ด๋””์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์คŒ
  • ์ฆ‰, ๋ช‡๋ฒˆ์งธ๊นŒ์ง€ ์ฝ์—ˆ๋Š”์ง€ ์•Œ๋ ค์คŒ
  • ๋””์Šคํฌ๋ฆฝํ„ฐ ๋‚ด์— ํŒŒ์ผ

fseek

  • ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐ๋กœ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์˜ฎ๊ฒจ๊ฐ
  • ์ธ์ž whence (SEEK_SET, SEEK_CUR, SEEK_END)

rewind

  • ์•„์˜ˆ ์ฒ˜์Œ์œผ๋กœ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ํ•จ์ˆ˜

(๋‹จ๋‹ตํ˜•) ๋””์Šคํฌ๋ฆฝํ„ฐ ๋‚ด์— ํŒŒ์ผ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ โ‡’ ftell

(๋‹จ๋‹ตํ˜•) ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์œ„์น˜๋กœ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ํ•จ์ˆ˜ โ‡’ fseek

(๋‹จ๋‹ตํ˜•) ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ํŒŒ์ผ ํฌ์ธํ„ฐ๋ฅผ ์ œ์ผ ์ฒ˜์Œ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ํ•จ์ˆ˜ โ‡’ rewind

ftello

  • ftell๊ณผ ๊ฐ™์€ ์—ญํ• 
  • off_t ์˜ ์ž๋ฃŒํ˜•์œผ๋กœ ๋ฐ˜ํ™˜ ๋ฐ›์Œ

fseeko

  • fseek๊ณผ ๊ฐ™์€ ์—ญํ• 
  • offset ์ธ์ˆ˜์˜ ์ž๋ฃŒํ˜•์ด off_t

fgetpos

  • ftell๊ณผ ๊ฐ™์€ ์—ญํ• , ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ํŒŒ์ผ ํฌ์ธํ„ฐ์˜ ์œ„์น˜๋ฅผ ์•Œ๋ ค์คŒ
  • ftell์€ posix, fgetpos๋Š” isoc standard์—์„œ ๋งŒ๋“  ํ‘œ์ค€

fsetpos

  • fseek๊ณผ ๊ฐ™์€ ์—ญํ• 
  • isoc ํ‘œ์ค€