이번에는 자주 사용하는 표준 입출력 라이브러리에서 제공하는 텍스트 모드 입출력 함수들을 소개할게요.
텍스트 모드로 입출력하는 함수는 문자 하나를 입출력하는 함수들과 라인 단위로 문자열을 입출력하는 함수들, 포멧에 맞게 입출력하는 함수들로 구분할 수 있어요.
다음은 표준 입출력 라이브러리에서 텍스트 모드로 입출력하는 함수들입니다.
#include <stdio.h >
– 문자 하나 읽어오기
int getc(FILE *fp); //매크로 함수
int fgetc(FILE *fp);
int getchar(void); //표준 입력 전용
– 문자 하나 출력하기
int putc(int ch, FILE *fp); //매트로 함수
int fputc(int ch, FILE *fp);
int putchar(int c); //표준 출력 전용
– 라인 단위 읽어오기
char *fgets(char *buf, int n, FILE *fp);
char *gets(char *buf); //표준 입력 전용
– 라인 단위 출력하기
int fputs(const char *str, FILE *fp);
int puts(const char *str);
– 포멧에 맞게 읽어오기
int fscanf(FILE *fp, const char *format, …);
int scanf(const char *format,…); //표준 입력 전용
int sscanf(const char *buf, const char *format,…); //버퍼로부터 읽어오기
– 포멧에 맞게 출력하기
int fprintf(FILE *fp, const char *format,…);
int printf(const char *format, …); //표준 출력 전용
int sprintf(char *buf, const char *format, …); //버퍼로 출력하기
앞에서도 얘기했듯이 표준 입출력 라이브러리는 버퍼링 정책을 사용합니다. 대부분의 파일들은 버퍼가 꽉 찼을 때 실제 입출력을 수행하는 FULL BUFFERING을 정책으로 삼고 있어요.
그런데 표준 입력과 표준 출력은 LINE BUFFERING을 정책으로 삼고 있어요. 이러한 이유로 표준 입력에서 입력받는 함수는 하나의 스트림(문자의 연속 나열이며 개행 문자로 구분)을 입력하였을 때 처리합니다. 만약 표준 입력 버퍼에 처리하지 않은 스트림이 있다면 새롭게 입력받지 않고 남아있는 스트림을 이용합니다.
다음은 getchar 함수를 다섯 번 호출하여 결과를 출력하는 예제 코드입니다. 실제 실행해 보면 엔터까지 입력하여야 getchar 함수는 동작하며 표준 입력 버퍼에 남은 데이터가 있으면 다시 입력받지 않고 버퍼에 있는 데이터를 이용하는 것을 알 수 있어요.
/********************************************************************** * ex_getchar.c * * exmple source – test getchar function * **********************************************************************/ #include <stdio.h> int main() { int i = 0; char buf[20]=""; for(i=0; i<5; i++) { printf("<%d> :",i); buf[i] = getchar(); } printf("buf:%s\n",buf); return 0; }
다음 실행 화면을 보면 첫 번째 getchar 함수 호출은 “abc개행 문자”를 입력한 후에 ‘a’를 반환하고 있어요. 그리고 두 번째와 세 번째, 네 번째 getchar 함수 호출은 표준 입력에 처리하지 않은 “bc개행문자”에서 ‘b’와 ‘c’, ‘\n'(개행 문자)를 반환하고 있어요. 다섯 번째 getchar 함수 호출은 표준 입력 버퍼가 비어 있어서 다시 하나의 스트림 “987개행문자”을 입력받아 첫 번째 문자인 ‘9’를 반환하고 있습니다. 이를 통해 표준 입력은 스트림 단위(라인 버퍼링)로 처리함을 알 수 있어요.
여기에서는 텍스트 모드의 입출력 함수들에 관한 설명은 여기서 마칠게요. 아마도 여러분은 이미 C언어 문법을 학습한 이들이 대부분이기 때문에 생략하더라도 큰 문제가 없을 것이라 판단합니다. 궁금한 점은 언제나 휴일 사이트(https://ehpub.co.kr)에서 <C언어 표준 라이브러리 함수>와 <디딤돌 C언어> 카테고리를 참고하세요.