본문으로 바로가기

    

 

입력 : 프로그램을 중심으로 프로그램 안으로 데이터가 흘러 들어오는 것 ex) 키보드
출력 : 프로그램 밖으로 데이터가 흘러 나가는 것 ex)모니터

스트림이란?
프로그램상에서 모니터와 키보드를 대상으로 데이터를 입출력 하기 위해서는 이들을 연결시켜주는 다리가 필요 이러한 다리 역할을 하는 것

 

위의 그림에서 다링 역할을 하는 스트림의 정체는 무엇일까? 
이는 운영체제에서 제공하는 소프트웨어적인 가상의 다리이다. 다시 말해서,
운영체제는 외부장치와 프로그램의 데이터 송수신의 도구가 되는 스트림을 제공하고 있다.

콘솔 입출력을 위한 '입력 스트림'과 '출력 스트림'은 프로그램이 실행되면 자동으로 생성되고,
프로그램이 종료되면 자동으로 소멸되는 스트림이다.
stdin    - 표준 입력 스트림 - 키보드 대상으로 입력
stdout - 표준 출력 스트림 - 모니터 대상으로 출력
stderr  - 표준 에러 스트림 - 모니터 대상으로 출력 

* 스트림이란 단어는 단방향으로만 데이터의 전송이 이뤄진다는 뜻이 담겨있다.

문자 단위 입출력 함수

문자 출력 함수 : putchar, fputc
모니터로 하나의 문자를 출력할 때 일반적으로 사용하는 두 함수
#include <stdio.h>
int putchar(int c);
int fputc(int c, File * stream);
//함수 호출 성공 시 쓰여진 문자정보가, 실패 시 EOF 반환

 

 

putchar 함수는 인자로 전달된 문자정보를 stdout으로 표현되는 표준 출력 스트림으로 전송하는 함수
fputc함수도 문자를 전송한다는것에서 동일하지만, 문자를 전송할 스트림을 지정할 수 있다.
즉, fputc 함수를 이용하면 stdout뿐만 아니라, 파일을 대상으로 데이터를 전송할 수 있다.

문자 입력 함수 : getchar, fgetc
키보드로부터 하나의 문자를 입력 받을 때 일반적으로 사용하는 두 함수는 다음과 같다.

#include <stdio.h>
int getchar(void);
int fgetc(File * stream);
// 파일의 끝에 도달하거나 함수 호출 실패 시 EOF 반환

 

 

getchar함수는 stdin으로 표현되는 표준 입력 스트림으로부터 하나의 문자를 입력 받아 반환되는 함수
fgetc함수도 하나의 문자를 입력받는 함수, 
getchar함수와 달리 문자를 입력 받을 스트림을 지정할 수 있다.

 


문자 입출력에서의 EOF ( EOF == -1)
EOF는 End Of File의 약자로서, 파일의 끝을 표현하기 위해서 정의해 놓은 상수이다.
따라서, 파일을 대상으로 fgetc 함수가 호출되면, 그리고 그 결과로 EOF가 반환되면, 
이는 '파일의 끝에 도달해서 더 이상 읽을 내용이 없다'는 뜻이 된다.
그렇다면 키보드를 대상으로 하는 fgetc 함수와 getchar 함수는 언제 EOF를 반환할까?
- 함수 호출의 실패
- Windows에서 Ctrl+Z키가 입력되는 경우

예제) EOF의 입력 확인하는 예제

#include <stdio.h>
#include <Windows.h>

void main()
{
	int ch;

	while (1)
	{
		ch = getchar();
		if (ch == EOF)
			break;
		putchar(ch);
	}

	system("pause");
}

 

 


문제1)
프로그램 사용자로부터 알파벳 문자를 하나 입력 받아서, 입력 받은 문자가 대문자면 이를 소문자로 변환해서 출력해주고, 입력 받은 문자가 소문자면 이를 대문자로 변환해서 출력해주는 프로그램을 작성해보자. 단, 문자의 입출력에는 getchar 함수와 putchar 함수를 사용하기로 하자. 그리고 프로그램 사용자가 알파벳 이외의 문자를 입력하는 경우에는 그에 따른 오류 메시지를 간단히 출력하기로 하자.

답:

#include <stdio.h>
#include <Windows.h>

int ConvCase(int ch)
{
	int diff = 'a' - 'A'; // 모든 문자의 대소문자간 차의 크기는 같다.
	if (ch >= 'A' && ch <= 'Z')
	{
		return ch + diff;
	}
	else if (ch >= 'a'&&ch <= 'z')
	{
		return ch - diff;
	}
	else
		return-1;
}


void main()
{
	int ch;
	printf("문자 입력 : ");
	ch = getchar(); //문자 입력
	ch = ConvCase(ch); // 문자 변환

	if (ch == 1)
	{
		puts("범위를 벗어난 입력입니다.");
	}
	putchar(ch); // 변환된 문자 출력

	system("pause");
}