본문으로 건너뛰기

입출력

스트림(Stream)

  • 스트림은 운영체제와 사용자 사이의 데이터를 순차적으로 전송하는 통로이다.
  • C에서 입출력은 추상화된 스트림을 통해 처리됨
  • 실제 장치(콘솔, 파일 등)와 프로그램 사이를 이어주는 중간 계층 역할

모든 입출력 대상은 스트림을 통해 접근됨.

주요 스트림

스트림의미연결 대상
stdin표준 입력키보드
stdout표준 출력화면
stderr표준 에러 출력화면

이들은 모두 FILE* 타입이며, 프로그램 실행 시 자동으로 열려있음.

버퍼(Buffer) 시스템

  • 스트림은 버퍼링(buffering)을 통해 입출력 성능을 최적화 한다.
  • 버퍼는 데이터를 일시적으로 저장하는 임시 메모리 공간이다.
  • 직접 장치에 접근하지 않고, 중간에 버퍼를 거쳐서 데이터를 모았다가 한꺼번에 처리

I/O 장치는 느리기 때문에, CPU가 그때마다 기다리는 걸 방지
I/O 호출 횟수를 줄여 시스템 콜 비용을 감소시킴

종류설명
Fully buffered버퍼가 꽉 찼을 때 전송 (ex. 파일)
Line buffered개행('\n')이 입력되면 전송 (ex. stdout)
Unbuffered즉시 전송 (ex. stderr)

동작 흐름

출력(printf, putchar 등)

  1. printf() 함수 호출 -> 내부적으로 stdout 스트림에 데이터 작성
  2. 데이터는 버퍼에 임시 저장
  3. 일정 조건(개행, 버퍼 가득참, 강제 flush 등)에서 실제 장치로 전송
  4. 운영체제를 통해 화면 출력
printf("Hello, World"); // 아직 화면에 안나올 수 있음
fflush(stdout); // 버퍼 비우기 -> 즉시 출력

입력(scanf, getchar 등)

  1. 사용자가 키보드로 입력 -> 운영체제가 stdin에 저장
  2. C 런타임이 stdin에서 데이터를 읽고, 변수에 저장
int x;
scanf("%d", &x); // 사용자가 입력한 값 파싱