본문 바로가기

C,C++

C++] Stream I/O

Stream I/O in C++

ⓐ C++ 은 type-safe Input/Ouput을 사용한다.

type-safe란 쉽게 말해 각각의 I/O operation이 데이터 타입에 민감한 것을 말한다.

따라서 정의되지 않은 데이터 타입에 대해 연산을 수행할 경우, 컴파일 에러가 발생한다.

ⓑ C++ I/O 연산자는 device 독립적으로, 메모리상에서 정보를 주고 받는다.

 

I/O format

formatted I/O(high-level) : byte들은 그룹화되고 string, int와 같은 타입으로 변환된다.

그래서 사용자는 >>,<< 오버로딩을 통해 customized된 I/O를 구현할 수 있다.

+)

const char* ptr="tibet";
cout<<static_cast<const void*>(ptr) <<endl;

formatted I/O에서는 타입을 알아야 실제 데이터 타입으로 converting 가능한데,

void* 는 타입을 몰라서 converting 이 불가능하다. 따라서 위와 같은 경우에는 ptr의 주소가 출력된다.

unformatted I/O(low-level) : byte가 binary 타입의 raw data로 취급되고 변환되지 않는다.

 

Stream input

>> 는 공백을 자동적으로 스킵하고 istream 객체의 참조를 리턴한다.

>> 이 if, for, while과 같은 조건문에 사용될 경우, C++은 암묵적으로 >> operator의 output을 void* 로 캐스팅한다.

만약 true 조건에서는, >>는 non-null pointer 타입으로, false 조건에서는 null pointer 타입으로 결과를 변환시킨다.

 

Stream input state

stateful software: state 관리 중 에러, 오버플로우 발생 유무 관리 <-> stateless software

C++ Stream은 stateful software로 cin, cout 등의 I/O stream이 각자 자신의 state를 보유하고 있다.

state의 void* casting operator가 statebit을 활용해서 nullptr, non-null pointer을 넣을지 결정한다.

 

  eofbit

- End of File 을 만날 경우를 나타낸다.

- EOF 멤버 함수로 체크 가능. e.g. cin.eof()

ⓑ  failbit

- 형식 에러가 발생했을 경우(e.g. 데이터 타입 mismatch, 문자가 아직 stream에 남아 있을 경우 등)를 나타낸다.

- fail 멤버 함수로 체크 가능. e.g. cin.fail();

ⓒ badbit

- 데이터가 잘리는 에러가 발생했을 경우를 표시한다.

- bad 멤버 함수로 체크 가능. e.g. cin.bad();

ⓓ goodbit

- eofbit, failbit, badbit이 아닌 경우를 나타낸다.

- good 멤버 함수로 체크 가능. e.g. cin.good();

 

rdstate() 멤버 함수는 현재 에러 상태를 리턴한다. e.g. cin.rdstate();

clear() 멤버 함수는 특정한 state bit빼고 모든 flag를 내린다(디폴트 인자는 goodbit.) e.g. cin.clear();  cin.clear(ios::failbit);

setstate() 멤버 함수는 인자의 bit를 1로 설정한다(flag를 올린다) e.g.cin.setstate(ios::failbit);