입출력 클래스는 ios_base 라는 기반클래스로 함. 입출력 데이터의 타입을 여기서 고름.
그다음 ios 클래스를 사용한다. 그때 스트림버퍼를 초기화함.
현재 입출력 작업의 상태를 처리 하기도 함. 예를 들어
istream은 실제 입력을 수행하는 클래스
std::cin >> a;
cin은 istream 클래스 객체 중 하나이다.
아니 그럼 여태 써본결과, 온갖 변수들을 넣어도 출력이 되는데..
어케 구현돼있음?
'오버로딩으로 모든 타입들을 만들어뒀음.' 컽!
입력비트 중 failbit, badbit가 true면 true를 리턴한다.
입력 플래그 초기화. goodbit로 초기화. fail상태를 지움.
첫번째인자(100만큼)~ 두번째인자('\n')가 나올때까지 버퍼에서 무시함.(두번째 인자 포함)
flag
)와 조작자(Manipulator)인자를 하나 받는 버전
std::cin.setf(ios_base::hex)
인자를 두개 받는 버전
std::cin.setf(ios_base::hex, ios_base::basefield)
#include <iostream>
#include <string>
int main(){
int t;
while(true){
std::cin >> std::hex >> t;
std::cout << "입력 :: " << t << std::endl;
if(std::cin.fail()){
std::cout<<"제대로 입력하세요" << std::endl;
std::cin.clear();
std::cin.ignore(100,'n');
}
if(t==0)break;
}
}
std::hex
: 16진수로 바꿔주는 함수조작자.
boolalpha
: true, false 를 1, 0 으로 처리
left
: 출력형식을 왼쪽으로 정렬
right
: 출력형식을 오른쪽으로 정렬
streambuf
: C++ 의 입출력 라이브러리에 대응되는 스트림버퍼 클래스
스트림은 문자들의 순차적 나열이라 보면 됨.
문자도 스티림, 하드디스크 파일읽는 것도 스트림, TCP/IP 통신하는 것도 스트림, 모두 스트림을 통해 이루어짐.
streambuf 는 스트림상태를 나타내기 위해서 세개의 포인터
를 정의하고 있음.
#include <iostream>
#include <string>
int main(){
std::string s;
std::cin >> s;
// 위치 지정자를 한칸 옮기고 그다음 문자를 훔쳐본다
// (이때는 움직이지 않음)
char peek = std::cin.rdbuf()->snextc();
if(std::cin.fail()) std::cout<<"Failed";
std::cout<<"두 번째 단어 맨 앞글자 :" << peek << std::endl;
std::cin>> s;
std::cout<< "다시읽으면 : " << s << std::endl;
}
char peek = std::cin.rdbuf()->snextc();
에서
cin.rdbuf()
를 호출하면 현재 cin 객체를 수행하는 streambuf 객체를 가리키는 포인터를 리턴함. (get area-g 포인터)
이 streambuf 객체에는 get area 만 있음을 알 수 있음.
snextc
함수는 '스트림 위치 지정자'를 '한칸 전진'시킴.