[C++] 7.1 C++에서의 입출력

C++ 입출력 라이브러리

입출력 클래스는 ios_base 라는 기반클래스로 함. 입출력 데이터의 타입을 여기서 고름.
그다음 ios 클래스를 사용한다. 그때 스트림버퍼를 초기화함.
현재 입출력 작업의 상태를 처리 하기도 함. 예를 들어

  • eof 함수를 호출하여 파일끝에 도달했는지 확인가능.
  • good 함수를 호출하여 입출력이 잘 수행됐는지 확인가능.

istream 클래스

istream은 실제 입력을 수행하는 클래스
std::cin >> a;
cin은 istream 클래스 객체 중 하나이다.

아니 그럼 여태 써본결과, 온갖 변수들을 넣어도 출력이 되는데..
어케 구현돼있음?
'오버로딩으로 모든 타입들을 만들어뒀음.' 컽!

cin.fail()

입력비트 중 failbit, badbit가 true면 true를 리턴한다.

cin.clear()

입력 플래그 초기화. goodbit로 초기화. fail상태를 지움.

cin.ignore(100, '\n')

첫번째인자(100만큼)~ 두번째인자('\n')가 나올때까지 버퍼에서 무시함.(두번째 인자 포함)

  • ignore함수를 통해 개행문자가 나올때 까지 값을 무시할 수 있게 됨.

형식 플래그(formatflag)와 조작자(Manipulator)

cin.setf()

인자를 하나 받는 버전
std::cin.setf(ios_base::hex)

  • 인자로 준 형식플래그를 그대로 적용하기만 함

인자를 두개 받는 버전
std::cin.setf(ios_base::hex, ios_base::basefield)

  • 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 는 스트림상태를 나타내기 위해서 세개의 포인터를 정의하고 있음.

  • 버퍼 끝부분을 가리키고 있는 끝 포인터
  • 클래스 입력 버퍼 get area : g 포인터
  • 클래스 출력 버퍼 put area : p 포인터
#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 함수는 '스트림 위치 지정자'를 '한칸 전진'시킴.
    • 그래서 hello world 에 w에 포인터가 옮겨지고, 그 순간만 w만 보였던 것임.
  • 이후엔 포인터가 옮겨져있기 때문에 world 가 보이게 된다.

좋은 웹페이지 즐겨찾기