[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 가 보이게 된다.
Author And Source
이 문제에 관하여([C++] 7.1 C++에서의 입출력), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@psh4204/C-7.1-C에서의-입출력저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)