게임프로그래밍 개발 수업/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()을 한번만 사용했다.