프로그래밍/C

7.1 표준 입력과 출력(Input and Output)

피노리코 2014. 11. 8. 14:59

입력과 출력 기능은 C 언어 자체에서 제공하지 않으므로 그 기능을 강도하지 않았다. 그럼에도 실제적인 프로그램은 앞에서 소개한것 보다 더욱 복잡하게 주위 환경과 상호작용을 한다. 이 장에서느 표준 라이브러리와 입출력 시스템에 제공하기 뒤해 설계된 함수와 문자열 조작(string handling),기억장치관리(storage management),수학적 루틴(mathematical routines)과 C프로그램을 위한 다른 여러 함수들을 기술하고자 한다. 그중에서도 입력과 출력에 대해 집중적으로 기술한다

ANSI 표준은 이 라이브러리 함수들을 세밀하게 정의하는데 현존하는 어떠한 C 시스템과 서로 호환성을 가져야한다 라고 정의하고있다 표준 라이브러리에 의해 제공된 함수를 사용하여 만들어진 프로그램을 변경하지 않은 상태에서도 다른 시스템에서도 똑같이 동작해야 한다는 말이다.

라리브러함수의 속성은 12개이상의 헤더에서 자세히 설명하였다 <stdio.h> <string.h> <ctype.h>등인데 벌써 여러 번 소개하였다 여기서는 모든 라이브러리를 소개하지 않을 것이다 왜냐하면 이 장의 목적은 C프로그램을 작성할때 이 헤더들을 어떻게 사용하는지를 설명하는데 있기 때문이다


제 1장에서 말한 바와 같이 표준 라이브러리 함수를 사용하여 텍스트의 입력과 출력의 간단한 동작을 실행 할수 있다 문자 stream은 여러개의 행으로 구성되는데 각 행의 끝에는 행바꿈 문자가 있다. 라이브러리의 함수는 행바꿈 문자 또는 리턴키 등에 적절히 대응하는 동작을 해야한다. 가장 간단한 입력 방법은 보토의 키보드로 표준 입력ㅢ getchar를 이용하여 한번에 한 문자씩 읽어들이는 것이다


int getchar(void)


getchar는 그것이 호출 될때마다 다음의 입력문자를 넘겨주고 파일의 끝을 만나면 EOF라는 값을 넘겨준다 EOF는 상수인데 <stdio.h> 에 정의되어있다 그 값은 -1로 정의되지만 기계에 따라 다를수도 있으므로 -1을 직접사용하는 것보다는 EOF를 사용하는 것이 좋다

대부분의 환경에서는 <을 이용하여 키보드 대신에 파일을 이용할 수있게 한다.(redirection)만약 prog라는 프로그램 내에서 getchar가 사용되었다면,infile이라는 파일로 부터 prog문자를 읽어 들이게 다음과 같이 한다


prog <infile


prog 프로그램 내에서는 입력이 어디로부터 오는지에 대해 신경 쓰지 않아도 좋다. 그리고 "<infile"은 argv안에 있는 명령 라인 매개변수(argument)에 포함되지 않는다. 입력전환(redirection)은 만약 입력이 다른 프로그램으로부터 온다 해도(파이프라는 방식을 사용해서)밖에서는 보이지 않는다. 일부 시스템에서 명령라인(command line)


other | prog


은 otherprog와 prog라는 두 프로그램을 실행 시키고 otherprog의 표준 출력을 prog의 표준 입력으로 되게 한다.


함수

int putchar(int)


은 출력으로 사용된다. putchar(c)는 문자 c를 표준 풀력인 스크린에 보낸다 putchar는 문자를 출력하는데 에러 발생 시에는 EOF를 리턴한다. 출력은>filename에 의해 파일로 방향 전환이 가능하다 prog가 putchar를 사용하는 경우


prog >outfile


와 같이 해주면 표준 풀력 대신 outfile을 쓸 것이다. 만일 파이프 기능이 있다면


prog | anotherprog


은 anotherprog의 표준 입력에 prog의 표준 출력을 집어 넣는다. printf에 의해 생성되 ㄴ풀력 또한 표준 출력이 된다. putchar와 printf의 호출이 적당히 혼잡되어 있는 경우, 그들의 호출 순서에 따라 출력이 나온다.

입력/출력 라이브러리 함수를 사용하는 프로그램의 시작부분에는 다음행이 반드시 있어야 한다.


#include <stdio.h> 


이때 이름은<와>를 사용하여 묶는데 이것은 표준 지정장소에 stdio.h파일이 있다는 뜻이다

대부분의 프로그램은 하나의 입력 stream에서만 읽어 들이고 하나의 출력 stream으로만 출력시킨다,getch,putchar,printf만 사용해도 이런 프로그램을 작성할 수있다. 한 프로그램의 출력을 다음 프로그램의 입력으로 연결시키기 위한 방향 전환(redirection)을 사용한다면 입력 하나 출력 하나로도 많은 일을 할 수있다. 예를 들어 입력을 소문자로 바꾸어주는 lower라는 프로그램을 생각해보자


#include <stdio.h> 

#include <ctype.h>


int main() /* lower: convert input to lower case */

{

    int c;

    while ((c = getchar()) != EOF)

        putchar(tolower(c));

    return 0;

}


함수 tolower는 <ctype.h> 에서 정의 되어있다. 이것은 다른 문자는 건드리지 않고 대문자를 소문자로만 바꾸어준다.

앞에서 이미 언급했던 <stdio.h> 에 있는 getchar와 putchar와 같은 함수와 <ctype.h>에 있는 tolower들은 매크로(macro)이다


예제 7-1 대문자는 소문자로 또는 소문자는 대문자로 변환시키는 프로그램을 작성하되,argv[0]에서 찾아낸 이름을 사용하라.