게임프로그래밍 개발 수업/C언어 수업

C언어 4.11 스트림과 데이터의 이동

막뇌 2023. 4. 11. 01:12

데이터의 입출력이 가능한 이유

스트림이란 ? 영어 단어로는 어떤 흐름이라는 뜻이 있다. 말 그대로 데이터의 흐름, 각각 입력과 출력의 흐름이 있기 때문에 출력과 입력이 가능한 것이다.

 

입출력 스트림이란?

OS가 데이터의 입출력을 위해 놓아주는 통로(tunnel)이다. 

 

 

 

문자열을 입력받기 가장 적절한 함수는 fgets 함수이다.

#include <stdio.h>

int main() {
	char str[7];
	int i;
	for (i = 0; i < 3; i++) {
		fgets(str, sizeof(str), stdin);
		printf("Read %d: %s \n", i + 1, str);
	}
	return 0;
}

엔터키입력을 해보면, 줄바꿈으로 받아들이긴 하지만 뒤에 올 문자입력의 기회가 사라지는 문제가 생긴다.

 

 

표준 입출력 버퍼란?

버퍼란 데이터를 잠시 보관해주는 개념이며 데이터를 모아서 이동하는게 효율적이기 때문에 버퍼를 사용한다는 점을 알고 가면 되겠다.

 

 

잘못된 예시)

#include <stdio.h>

int main() {
	char perID[7];
	char name[10];
	fputs("주민번호 앞 6자리 입력: ", stdout);
	fgets(perID, sizeof(perID), stdin);
	fputs("이름 입력: ", stdout);
	fgets(name, sizeof(name), stdin);
	printf("주민번호: %s \n", perID);
	printf("이름: %s \n", name);
	return 0;
}

엔터키를 읽어 버려서 이름이 짤렸다.

 

ClearLineFormReadBuffer 버퍼를 비우는 함수를 사용해서 수정한 코드

#include <stdio.h>

void ClearLineFormReadBuffer(void) {
	while (getchar() != '\n');
}

int main() {
	char perID[7];
	char name[10];
	fputs("주민번호 앞 6자리 입력: ", stdout);
	fgets(perID, sizeof(perID), stdin);
	ClearLineFormReadBuffer();	//입력 버퍼를 비웠다.
	fputs("이름 입력: ", stdout);
	fgets(name, sizeof(name), stdin);
	printf("주민번호: %s \n", perID);
	printf("이름: %s \n", name);
	return 0;
}

줄바꿈이 감지될때까지 입력을 받는함수를 추가하여 수정했다. 

 

 

#include<stdio.h>
#include<string.h>

void RemoveBSN(char str[])
{
	int len = strlen(str);
	str[len - 1] = 0;
}
int main() {
	char str[100];
	printf("문자열 입력: ");
	fgets(str, sizeof(str), stdin);
	printf("길이: %d, 내용: %s \n", strlen(str), str);
	//strlen()은 NULL을 제외한 문자열 길이를 반환한다.

	RemoveBSN(str);
	printf("길이: %d, 내용: %s \n", strlen(str), str);
	return 0;
}

입력을 받은 후에 RemoveBNS()함수를 사용하면 입력했던 값중에 마지막으로 입력된 Enter키, 그러니까 줄바꿈 문자가

삭제 되면서 엔터키를 제외한 입력값이 된다.

예제에서는 입력을 한번만 받았기 때문에, RemoveBSN()을 한번만 사용했다.