POST

C언어 스트림(stream)의 활용 - 문자 단위 입출력 함수

문자단위 입출력 함수


우선 문자 단위 출력함수에 대해 알아보자.

문자 출력함수에는 두가지가있다.

putchar

fputc

이둘은 비슷하지만 다르다.


첫번째인 putchar는 stdout 으로 표현되는 표준 출력 스트림으로 전송하는 함수이다. 따라서, 이것은 전달된 문자를 모니터로 출력하는 함수이다.

두번째 fputc는 문자를 전송한다는 측면에서는 putchar와 다를바가 없지만 fputc 함수는 문자를 전송할 스트림을 지정할 수 있다.

스트림이란? - 바로가기


각각의 사용법은 이러하다.

#include<stdio.h>


int main(void) {

int cha = 'c'; // int 형으로 선언된 이유는 아래에서 설명

printf("putchar: ");

putchar(cha);


printf("\nfputc(stdout): ");

fputc(cha, stdout);


printf("\nfputc(stderr): ");

fputc('c', stderr);


printf("\n");

return 0;

}



문자하나를 출력하기 위한 함수는 위와 같다. 그렇다면 입력 받는 함수는 무엇인가?


입력받는 함수도 위처럼 두개의 함수가 존재한다.

getchar

fgetc


getchar 함수는 stdin으로 표현되는 표준 입력 스트림으로부터 하나의 문자를 입력 받아서 반환하는 함수이다

fgetc는 함수는 똑같이 하나의 문자를 입력받는 것이지만 문자를 입력 받을 스트림을 지정할 수 있다.


각각의 사용방법은 이러하다.  출력함수와 같이 사용하여 보자.

#include<stdio.h>


int main(void) {

int ch1; // int 형으로 선언된 이유는 아래에서 설명

int ch2; // int 형으로 선언된 이유는 아래에서 설명


ch1 = getchar(); // 문자 입력

ch2 = fgetc(stdin); // 엔터키 입력


putchar(ch1); // 문자 출력

fputc(ch2, stdout); // 엔터키 출력


return 0;

}


엔터키도 개행이라는 하나의 문자(\n 아스키코드로는 10)로 입력 되기 때문에 ch2에는 '\n' 가 저장 된다.

그래서 여기엔 하나의 문자가 입력되고 출력되는 것으로 보이지만 실제로는 두개의 문자가 입력되고 출력되어 진다.




여기서 fputc나 fgetc 함수는 호출 실패시 EOF를 반환 하도록 되어 있는데, 이 EOF는 무엇일까?


EOF는 End OF File의 약자로서, 파일의 끝을 표현하기 위해서 정의해 놓은 상수이다.

파일을 대상으로 fgetc함수가 호출되면, 그 결과로 EOF가 반환된다. 이는 "파일의 끝에 도달해서 더이상 읽을 내용이 없다" 는  뜻이 된다.


EOF가 반환되는 경우는 두가지가 있다.

첫번쨰는 위에서 말햇다싶이 함수호출에 실패 햇을 경우이고

두번째는 윈도우에서 Ctrl+Z , 리눅스에서 Ctrl+D 가 입력 되었을 경우이다.


이것이 필요한 경우는 아래와 같다.

#include<stdio.h>


int main(void) {

int ch;


while (1) {

ch = getchar();

if (ch == EOF)

break;

else

putchar(ch);

}


return 0;

}




 자, 그럼 왜 int형 변수에 문자를 담는 것일까?


앞서 소개한 함수를 살펴보자.

int getchar (void);

int fgetc(FILE * stream);


이것들의 반환형은 보시다싶이 int형으로 정의 되어 있다.

그 이유는 바로 EOF때문이다 EOF는 -1로 정의된 상수이다. 만약 이것이 반환형이 char라면 문제가 생기게 되는데, 그 문제는 char를 unsigned char로 처리하는 컴파일러 때문이다.


EOF가 입력되었지만 컴파일러가 전혀 엉뚱한 양의 정수로 형변환이 일어나게된다. 이를 방지하기위해 어떠한 상황에서도 -1을 인식할 수 있는 int형을 반환형으로 정의해 놓은 것이다.

물론 반환되는 값을 유지하기 위해서는 int형 변수에 값을  저장해야 한다.