Language/C++

[C++] 3.Unmanaged Programming: 입력 스트림(Input Stream)

coco_daddy 2024. 1. 21. 03:10

C에서 입력을 가져오는 경우

  • 실행 중에 캐릭터 배열이 얼마나 할당되어 있는지 알 수 없다.
  • scanf는 경계 검사를 하지 않음. → 5개로 할당이 되어있다면, 그것을 넘는 글자 수를 받았을 때, 지정되지 않은 메모리를 접근하려고 할 것이다.
  • char first_name[20]; scanf(%s", first_name);

C++에서 입력을 가져오는 경우

scanf() 와 cin

  • cin 또한 char 배열의 길이를 모른다.
  • scanf()와 같은 위험성이 있다.
  • 이를 피하려면 setw()를 사용하면 된다.
char first\_name\[20\]; cin >> first\_name;
char name[4];
cin >> setw(4) >> name;

스트림 상태

: 읽어오다가 실패했을 때 상태를 저장한다.

  • namespace - ios_base

bit flag

  • goodbit: 문제없음
  • eofbit: 파일 끝
  • failbit: string을 int로 읽으려고 하는 등 실패함
  • badbit: 어떤 문제가 발생함
  • method
    • good()
    • eof()
    • fail()
    • bad()

스트림 상태 확인 예제

int number; 

cin >> number;
  • 456abc → eofbit: unset → failbit:unset : 456을 잘 읽었고, 파일 포인터는 a를 가리키고 있음.
  • 456 → eofbit: (un)set → failbit:unset : 456뒤 개행이 있으면 eof를 만나지 않음.
  • abc → eofbit: unset → failbit:set : 문자를 int로 읽으려고 함.
  • eof → eofbit: set → failbit:set : eof를 만났으므로 저장하지 못하고 종료.

입력 버리기

  • 스트림 상태가 안 좋을 때, 입력을 무시하고 정상적인 입력을 다시 받고자 함.
  • 이 경우, 입력을 새로 받기 전, 스트림을 비워주어야 한다.
  • clear()
  • stream을 좋은 상태로 돌려준다.
  • 문제가 생겼을 때 켜진 비트를 다시 꺼준다.
  • ignore()
  • 파일 끝에 도달하거나 지정한 수만큼 문자를 버리면 멈춘다.
cin.ignore() // 문자를 1개 버림.
cin.ignore(10) // 문자를 10개 버림.

/* eof가 아니라 특정 문자를 지정해주기 */

cin.ignore(10, '\n'); // 문자를 10개 버림, 그 전에 \n을 만나면 멈춤.
cin.ignore(LLONG_MAX, '\n'); // 최대 문자 수를 버림. 그 전에 \n을 만나면 멈춤. 
                             // 한 줄을 모두 버리는 방법

get()

  • \n을 만나기 전까지의 모든 문자를 가져온다.
  • \n문자는 입력 스트림에 남아있다.
get(name, 100); 
// 99개의 문자('\0' 때문에)를 가져오거나 개행이 나올 때까지 문자를 가져옴. 
//가져온 문자는 char배열에 배치함.
get(name, 100, '#');
// 99개의 문자를 가져오거나 '#'이 나올 때까지 문자를 가져옴. 
//가져온 문자는 char배열에 배치함.

getline()

  • 개행 문자를 만나기 전까지 모든 문자를 가져옴.
  • 개행 문자는 입력 스트림에서 버린다
getline(name, 100); 
// 99개의 문자('\0' 때문에)를 가져오거나 개행이 나올 때까지 문자를 가져옴. 
//가져온 문자는 char배열에 배치함.
getline(name, 100, '#');
// 99개의 문자를 가져오거나 '#'이 나올 때까지 문자를 가져옴. 
//가져온 문자는 char배열에 배치함.

input stream logo