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);
'C,C++' 카테고리의 다른 글
C,C++] 구조체(struct) (0) | 2023.09.13 |
---|---|
C++] Stream I/O function(read, gcount, write) (0) | 2023.08.12 |
C++] Stream I/O function(get, getline, ignore,put) (0) | 2023.07.30 |
C] 표준 입출력 방법 정리(scanf,printf,fgets,getchar,fgetc 등) (0) | 2023.07.19 |
C++] 빠른 입출력 방법(endl,'\n',cin.tie(NULL), ios_base::sync_with_stdio(false)) (0) | 2023.07.18 |