C++의 입력

개요


CPP에서 입력을 받을 때 어떻게 하는지 예외처리는 어떻게하는 지 각 함수들의 기능 들에 대해서 알아보겠다.




cpp의 입출력


c++ 프로그램은 입력과 출력을 바이트들의 스트림이라고 간주한다.

입력 시 프로그램은 입력 스트림으로부터 바이트들을 추출하고, 출력시는 삽입한다.

하나의 스트림을 프로그램의 입력에 연결하고 하나의 파일에 연결한다.

즉 입력 스트림은 양쪽에 연결을 한다. 아래의 그림과 같다.


한 객체를 생성하면 하나의 스트림이 열리고 자동으로 버퍼가 생성되고 그 버퍼가 스트림에 연결된다.

그러고 나면 클래스의 멤버 함수들을 사용할 수 있게 된다.




cin


cin은 입력을 수행하는 객체이다. cin은 iostream 파일에 입력스트림을 나타내는 객체로 정의 되어있다.

화이트 스페이스가 아닌 문자가 나올 때까지 건너뛴다.

그리고 데이터형과 일치하지 않는 문자에 도달할 때까지 읽는다.

1
2
3
4
int elevation;
cin >> elevation;
//위와 같은 코드에 -123Z를 넣었다고 가정하면
//Z는 입력스트림에 그대로 남겨져있고 elevation에는 -123이 대입된다.




cin flag


cin은 goodbit, failbit, badbit, eofbit 총 4개의 플래그 비트가 있다.

각각의 멤버 함수를 사용하면 비트가 켜졌는지 알 수 있다. cin.eofbit()를 사용하면 켜졌을 때 true를 반환한다.

failbit는 복구할 수 있는 비트 badbit는 복구할 수 없는 심각한 오류일 때 켜진다.

eofbit는 단어에서 알 수 있듯이 EOF를 감지한다.

cin 메서드가 EOF를 발견하면 플래그가 켜지고 cin은 더이상 입력을 받아들이지 않는다. 그렇기 때문에 무한 루프가 된다.

이때 cin.clear() 메서드는 EOF 플래그를 지우고 다시 입력이 진행될 수 있도록 한다.

플래그비트가 복구되었다면 스트림의 버퍼가 보유하고 있는 내용들을 cin.ignore() 함수를 이용하여 지울 수 있다.




cin flag on시에 상태


부적절한 입력이 들어왔을 때 cin 또는 cout 객체는 스트림 상태를 나타내는 하나의 데이터 멤버를 가지고 있다.

스트림 상태는 eofbit, badbit, failbit라는 세게의 ios_base 원소로 이루어진다.

cin연산이 파일의 끝에 도달하거나 ctrl + d를 감지하면 eofbit가 감지된다.

cin이 기대하는 문자를 읽지 못하거나 접근할 수 없는 파일을 읽을 때, 쓰기방지된 디스크에 쓰려할 때도 failbit가 감지된다.

badbit는 알수 없는 원인으로 스트림이 손상되었을 때 설정된다.



cin 상태 설정


clear()과 setstate()가 있다. 둘다 상태를 설정한다는 기능은 같지만 설정 방법이 다르다.

cin.clear()를 호출하면 3개의 상태비트를 모두 해제한다.

만약 매개변수를 넣으면 그 매개변수의 상태와 다른 비트들의 상태를 같게한다.

그러나 setstate()에 매개변수를 넣으면 해당하는 매개변수만 비트를 해제한다.




get(ch) vs get()


get(char &)와 get()는 화이트 스페이스를 건너뛰지 않는 단일 문자입력기능을 제공한다.

매개변수가 있다면 입력 문자를 대입하고 없다면 입력문자를 int형으로 변환하여 리턴값으로 사용한다.

파일이 끝났을 때 리턴값은 get(ch)는 false로 변환하고 get()은 EOF를 리턴한다.