Part17 콘솔 입출력과 파일 입출력
17.1 스트림이란
스트림(Stream)
- Stream: 개울, 시내, 줄기
- 데이터를 입력하고 출력하기 위한 다리
- 키보드로 데이터를 입력 -> 표준 입력 스트림
- 모니터로 데이터를 출력 -> 표준 출력 스트림
- 표준 입출력 스트림은 프로그램 시작 시 생성되며 프로그램 종료 시 소멸됨
- 표준 입력 스트림: stdin(Standard Input)
- 표준 출력 스트림: stdout(Standard Output)
- 표준 에러 스트림: stderr(Standard Error), 출력 대상이 모니터이기에 stdout과 같음
버퍼(Buffer)
- Buffer: 완충제
- 처리할 데이터를 임시로 저장하는 장소
- 입력 버퍼: 입력 데이터를 저장하기 위한 버퍼
- 출력 버퍼: 출력 데이터를 저장하기 위한 버퍼
- 데이터 전송을 벽돌을 옮기는 일에 비유한다면,
스트림(다리)이 있기 떄문에 버퍼(리어카)에 버퍼링(리어카에 벽돌을 쌓기)을 할 수 있음
버퍼링(Buffering)
- 버퍼를 채우는 동작
- 문자를 개별 처리하는 것보다 문자들을 모아서 일괄 처리하는 것이 효율적이기에 성능 향상에 도움이 됨
17.2 콘솔 입출력
콘솔 표준 입출력 함수
-
헤더 파일: stdio.h
-
getchar: Get Character, 키보드로부터 한 문자를 입력 받음, 서식 문자 %c 사용
호출이 실패했을 때 EOF(-1) 반환
-
putchar: Put Character, 모니터에 한 문자를 출력, 서식 문자 %c 사용
호출이 실패했을 때 EOF(-1) 반환
-
EOF(End Of File): 파일의 끝을 의미, stdio.h에 -1로 매크로 상수 정의, 입력 함수 사용 시 [ctr+z] 입력하면 EOF로 인식
ex) getchar() 함수 실행 시 [ctz+z]를 입력하면 ch가 -1이 되어 반복문이 종료됨
#include <stdio.h>
int main(void)
{
char ch = 0;
while(ch != EOF)
{
ch = getchar();
putchar(ch);
}
return 0;
}
콘솔 비표준 입출력 함수
- 헤더 파일: conio.h(Console Input/Output)
- 비표준 함수는 버퍼를 사용하지 않아 속도가 빠르나, 데이터를 일괄 처리하는 경우에 비효율적
17.3 파일 입출력
파일 입출력의 필요성
- 실행 중 데이터가 생성되면 데이터는 메모리에 보관 됨. 프로그램이 종료되면 메모리에 저장된 데이터는 사라짐
- 데이터를 프로그램이 종료된 후에도 계속 사용하기 위해선 파일에 저장해야 함
- 문자열과 같은 텍스트 기반의 데이터 파일인 텍스트 파일(Text File)
ex) *.txt, *c, *.hwp, *.doc
- 이진 형식으로 인코딩된 데이터 파일, 바이너리 데이터를 저장하는 바이너리 파일(Binary File), 이진 파일이라고도 하는 것이 있음
ex) *.obj, *exe, *lib, *dll
파일을 이용한 입출력 과정
Step1~Step2.
- 파일 스트림을 생성해야 프로그램과 파일을 연결하는 다리가 생김
- 파일 스트림을 생성하려면 파일 포인터가 필요함
- 파일 포인터는 파일에 접근하는데 사용되는 FILE 구조체 포인터를 의미
- 파일 스트림(FILE 구조체 포인터)을 생성하고 파일을 여는 함수가 fopen() 함수, Step1~Step2를 한 방 해주는 함수
Step3.
- 파일을 연 후 여러 파일 입출력 함수를 이용해서 입출력 작업 수행 가능
Step4.
- 파일 입출력이 끝난 후에는 파일을 닫아야 하는데 이 때 사용되는 함수가 fclose() 함수
fopen() 함수와 fclose() 함수
- 헤더 파일: stdio.h
- fopen() 함수: 파일 스트림을 생성하고 파일을 오픈
첫 번째 인자: filename, 두 번째 인자: mode
- fclose() 함수: 파일 스트림을 닫고 파일도 닫음
표준 파일 입출력 함수
대표적인 표준 파일 입출력 함수
- 파일 입출력 과정에는 fopen() 함수를 통해 파일 스트림을 생성하고 파일을 열고 나면 어떤 작업(파일 입출력)을 수행하고 파일을 닫는데, 이 때 어떤 작업을 할 수 있게 해주는 함수들이 표준 파일 입출력 함수이다
- 표준 입출력 함수는 파일 입출력이 불가하지만, 표준 파일 입출력 함수는 위의 표와 같이 FILE* stream 자리에 stdin or stdout을 적적하게 넣으면 표준 입출력도 적용할 수 있다
나머지 함수들은 이해하기 위해 정리할 부분이 적어 코드로 직접 테스트만 진행하고 기록하진 않겠습니다.
Reference
강의: 박정민, 『C 프로그래밍』, KOCW 한국산업기술대학교, 17강
교재: 박정민, 『열혈강의 C 언어 본색 명강의가 일으키는 C 언어 기적』, 프리렉 (2011), p575-617.