입출력
스트림(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
등)
printf()
함수 호출 -> 내부적으로stdout
스트림에 데이터 작성- 데이터는 버퍼에 임시 저장
- 일정 조건(개행, 버퍼 가득참, 강제 flush 등)에서 실제 장치로 전송
- 운영체제를 통해 화면 출력
printf("Hello, World"); // 아직 화면에 안나올 수 있음
fflush(stdout); // 버퍼 비우기 -> 즉시 출력
입력(scanf
, getchar
등)
- 사용자가 키보드로 입력 -> 운영체제가
stdin
에 저장 - C 런타임이
stdin
에서 데이터를 읽고, 변수에 저장
int x;
scanf("%d", &x); // 사용자가 입력한 값 파싱