개인노트

[C언어] 표준 입출력 & 버퍼 본문

C/문법

[C언어] 표준 입출력 & 버퍼

BillnairK 2017. 7. 14. 16:23

▶ 표준 입출력 함수 ◀


우리가 사용하는 printf, scanf_s 함수 등... ANSI C의 표준에서 정의된 함수를 표준 입출력 함수라고 한다.

표준 입출력 함수를 통해 데이터를 입출력하는 경우 메모리 버퍼를 중간에 거치게 된다.

메모리 버퍼는 데이터가 출력 또는 입력 되기 전에 저장되는 임시 저장소이다. 메모리 버퍼에 저장하는 이유는 

데이터 전송의 효율성 때문이다. 데이터를 바로 이동시키는 것 보다 데이터를 한번에 모아서 전송 시키는 것이 효율적이다.


▶ fflush 함수 ◀


fflush 함수는 인자로 전달된 스트림의 버퍼를 지우는 역할을 한다.

fflush(stdout); // 표준 출력 버퍼를 비워라. 즉, 버퍼에 저장된 내용을 출력하라!

fflush(stdin); // 입력 버퍼의 지워짐은 데이터의 소멸이라는 뜻이다. 컴파일러마다 결과가 달라서 사용하기에 애매하다.


#include <stdio.h>

int fflush(FILE * stream);

→ 함수 호출 성공 : 0 반환, 함수 호출 실패 : EOF 반환 


[ 예제 1 ]


주민번호 앞자리와 이름을 입력받고 출력하는 프로그램이다. 하지만 결과를 보면 제대로 출력이 안된듯 보인다.

배열의 크기는 7로 6문자를 입력 받을 수 있다. 그리하여 6자리만 입력을 받게되고 \n은 입력 버퍼에 남아있는다.

하지만 fgets 함수는 \n를 만나면 함수가 끝나게 되어있으므로 다음에 fgets함수가 호출 되었을 때 입력 버퍼에 남아있던 

\n를 불러오게되어 입력이 끝나고 만다.


#include <stdio.h>


int main(void) {

char id[7];

char name[10];


fputs("주민번호 앞 6자리 입력 : ", stdout);

fgets(id, sizeof(id), stdin);

fputs("이름 입력 : ", stdout);

fgets(name, sizeof(name), stdin);


printf("주민번호 : %s\n", id);

printf("이름 : %s\n", name);


} 


[ 예제 2 ]


while (getchar() != '\n');를 사용하여 입력 버퍼에 남아있는 모든 문자를 지울 수 있다.

getchar()로 입력 버퍼에 남아있는 모든 문자를 불러오고 그렇게 되면 입력 버퍼에 있는 모든 문자는 사용되어 사라진다.

그리고 \n이 나올 때 까지 비교를 하다가 \n이 나오면 반복문의 조건이 일치하지 않아서 반복문이 끝나고

\n도 입력 버퍼에서 사라지게 된다.


#include <stdio.h>


int main(void) {

char id[7];

char name[10];


fputs("주민번호 앞 6자리 입력 : ", stdout);

fgets(id, sizeof(id), stdin);


while (getchar() != '\n');


fputs("이름 입력 : ", stdout);

fgets(name, sizeof(name), stdin);


printf("주민번호 : %s\n", id);

printf("이름 : %s\n", name);



Comments