C언어 입/출력 스트림과 입출력함수

    2018-02-09 15:08:58 작성

    스트림 (stream)

    지금까지 scanf함수등으로 사용자로 부터 입력을 받고, 또 printf함수등을 모니터에 출력을 해 왔습니다.
    프로그램이 실행 되면 키보드와 프로그램사이 또 프로그램와 모니터 사이에 이들을 연결시켜주는 매개체가 있어야 하는데 이를 스트림이라고 합니다.

    스트림은 위의 그림과 같이 단 방향으로 데이터 전송을 합니다.
    stdio.h는 standard input output입니다.
    stdio.h를 포함하면 표준 입출력 스트림을 프로그램 실행시 자동으로 생성하며 프로그램 종료시 자동으로 소멸됩니다.
    표준 스트림의 종류는 다음과 같습니다.

    stdin 표준 입력 스트림 키보드를 대상으로 입력
    stdout 표준 출력 스트림 모니터를 대상으로 출력
    stderr 표준 에러 스트림 모니터를 대상으로 출력

    문자 단위 입출력 함수

    표준입출력 스트림을 대상으로 하는 putchar 함수와 getchar 함수는 이미 살펴 보았습니다.
    fputc 함수와 fgetc 함수는 문자 입출력의 스트림 대상을 지정할 수 있는 차이점이 있습니다.

    int fputc(int c, FILE * stream);

    fputc 함수 호출시 쓰여진 문자 정보를 반환하고 실패시 EOF를 반환합니다.

    int fgetc(FILE * stream);

    fgetc 파일 끝에 도달하거나 함수 호출 실패시 EOF를 반환합니다.

    지금은 표준입출력 스트림을 사용한 예제를 보이겠습니다.
    입출력 스트림의 대상이 파일이면 파일을 읽고 씁니다.

    #include <stdio.h>
    
    int main(void) {
    	int ch1, ch2;
    	printf("문자를 입력하세요 : ");
    	ch1 = fgetc(stdin);
    	ch2 = fgetc(stdin);
    	printf("입력한 문자 : ");
    	fputc(ch1, stdout);
    	fputc(ch2, stdout);
    	putchar('\n');
    	return 0;
    }

    위의 예제에서 a문자 1개를 입력한후 엔터를 입력하면 두개의 문자가 입력된 것입니다. 엔터키도 ASCII 코드값이 10인 개행(\n)을 의미합니다.

    두 함수 모두 char형이 아닌 int형을 반환하는데 char형은 컴파일러마다 unsigned char가 기본으로 선언되기도 하기 때문에 -1값을 반환했을때 255의 값을 가지게 될 수 있기 때문에 int형으로 반환합니다.
    EOF란 End Of File의 약자로 파일의 끝을 표현하기 위해 정의해 놓은 상수이고 -1값을 가지고 있습니다.
    키보드를 통한 문자열 입력에서 EOF는 Windows 계열에서는 Ctrl+Z이고 linux 계열에서는 Ctrl+D입니다. 다음 예제는 EOF가 입력될때까지 문자를 하나씩 읽어 출력합니다.

    #include <stdio.h>
    
    int main(void) {
    	int c;
    	while (1) {
    		c = fgetc(stdin);
    		if (c == EOF) {
    			break;
    		}
    		fputc(c, stdout);
    	}
    	return 0;
    }


    엔터키를 입력하기 전까지 출력버퍼에 저장되었다가 엔터키 입력시 출력됩니다.


    문자열 단위 입출력 함수

    표준입출력 스트림을 대상으로 하는 puts 함수와 gets 함수에 대응하는 함수입니다.
    fputs 함수와 fgets 함수는 문자열 입출력의 스트림 대상을 지정할 수 있는 차이점이 있습니다.

    int fputs(const char * s, FILE * stream);

    fputs 함수는 성공시 음수가 아닌값을 반환하고, 실패시 EOF를 반환합니다.
    puts 함수와 다르게 자동개행되지 않습니다.

    char* fgets(char *s, int n, FILE * stream);

    fgets 함수는 두번째 인자로 가지고 올 문자열의 길이를 지정하여 가져오게 되고 끝에 자동으로 NULL문자를 추가하여 첫번째 인자로 전달된 변수에 저장합니다.
    fgets 함수는 파일끝에 도달하거나 함수 호출 실패시 NULL 포인터를 반환합니다.

    #include <stdio.h>
    
    int main(void) {
    	char str[7];
    	int i;
    	for (i = 0; i < 3; i++) {
    		fgets(str, sizeof(str), stdin);
    		printf("Read %d : ", i);
    		fputs(str, stdout);
    		fputc('\n', stdout);
    	}
    	return 0;
    }


    fgets 함수는 엔터키도 문자열의 일부로 받게 됩니다.
    I am\n가입력되면 "I am\n\0" 문자가 되어 6byte가 str변수에 저장되고 출력합니다.
    이때 \n도 문자열로 저장되어 개행이 한번더 이루어진 것을 볼수 있습니다
    C Programmer\n가 입력되면 fgets에서 최대 7자까지 저장이 가능하므로 "C Prog\0"을 저장하고 다음반복에서 "rammer\0"가 저장되어 출력되고 프로그램이 종료됩니다.


    연습문제

    fgetc와 fputc 함수를 사용하여 사용자에게 입력받은 문자의 대소문자를 변경하여 출력하는 프로그램을 작성하세요.