1. 스트림 : 데이터의 흐름, 혹은 데이터를 전송하는 소프트웨어 모듈
2. C++ 입출력 스트림 버퍼
1) 키 입력 스트림의 버퍼 - 입력 장치로부터 입력된 데이터를 프로그램으로 전달하기 전에 일시 저장
2) 스크린 출력 스트림 버퍼 - 프로그램에서 출력된 데이터를 출력 장치로 보내기 전에 일시 저장
3. C++ 표준은 스트림 입출력만 지원
스트림 입출력 방식(stream I/O) : 스트림 버퍼를 이용한 입출력 방식
4. 표준 입출력 스트림 객체
C++ 프로그램이 실행될 때 자동으로 생겨나는 스트림
5. ostream 멤버 함수
6. istream 멤버 함수 - 문자 입력, get() 함수
int ch;
while((ch = cin.get()) != EOF) { // EOF는 -1
cout.put(ch); // 읽은 문자 출력
if(ch == '\n')
break; // <Enter> 키가 입력되면 읽기 중단
}
char ch;
while(true) {
cin.get(ch); // 입력된 키를 ch에 저장하여 리턴
if(cin.eof()) break; // EOF를 만나면 읽기 종료
cout.put(ch); // ch의 문자 출력
if(ch == '\n')
break; // <Enter> 키가 입력되면 읽기 중단
}
7. 문자열 입력
istream& get(char* s, int n) : 입력 스트림으로부터 n-1 개의 문자를 읽어 배열 s에 저장하고 마지막에 '\0' 문자 삽입. 입력 도중 '\n'을 만나면 '\0'을 삽입하고 리턴
=> 입력 도중 키('\n')을 만날 때 - 읽기를 중단하고 리턴, 다시 get()으로 문자열 읽기를 시도하면 입력 스트림에 남은 '\n' 키를 읽게 되어 무한 루프에 빠짐 => cin.get()이나 cin.ignore(1);를 통해 문자 1개('\n')을 스트림에서 읽어 버려야 함
8. 한 줄 읽기
9. 입력 문자 건너 띄기와 문자 개수 알아내기
cin.ignore(10); // 입력 스트림에 입력된 문자 중 10개 제거
cin.ignore(10, ';'); // 입력 스트림에서 10개의 문자 제거. 제거 도중 ';'를 만나면 종료
10. 포맷 입출력 - 포맷 플래그, 포맷 함수, 조작자
플래그 | 값 | 의미 |
---|---|---|
ios::skipwq | 0x001 | 입력시 공백 문자(스페이스, 탭, 개행문자)를 무시 |
ios::unitbuf | 0x002 | 출력 스트림에 들어오는 데이터를 버퍼링하지 않고 바로 출력 |
ios::uppercase | 0x0004 | 16진수의 A~F. 지수 표현의 E를 대문자로 표현 |
ios::showbase | 0x0008 | 16진수이면 0x를, 8진수이면 0을 숫자 앞에 붙여 출력 |
ios::showpoint | 0x0010 | 실수 값에 대해, 정수 부분과 더불어 소수점 이하의 끝자리들을 0으로 출력 |
ios::showpos | 0x0020 | 양수에 대해 + 기호 출력 |
ios::left | 0x0040 | 필드를 왼쪽 맞춤(left-aling)형식으로 출력 |
ios::right | 0x0080 | 필드를 오른쪽 맞춤(right-aling)형식으로 출력 |
ios::internal | 0x0100 | 부호는 왼쪽 맞춤으로 숫자는 오른쪽 맞춤으로 출력 |
ios::dec | 0x0200 | 10진수로 출력. 디폴트 설정 |
ios::oct | 0x0400 | 8진수로 출력 |
ios::hex | 0x0800 | 16진수로 출력 |
ios::scientific | 0x1000 | 실수에 대해 과학 산술용 규칙에 따라 출력 |
ios::fixed | 0x2000 | 실수에 대해 소수점 형태로 출력 |
ios::boolalpha | 0x4000 | 설정되면, 논리값 true를 "true"로, false를 "false"로 출력하고, 설정되지 않으면, 정수 1과 0으로 출력 |
☑️포맷 플래그를 세팅하는 멤버 함수☑️
(1) long setf(long flags) : flags를 스트림의 포맷 플래그로 설정하고 이전 플래그를 리턴한다.
(2) long unsetf(long flags) : floags에 설정된 비트 값에 따라 스트림의 포맷 플래그를 해제하고 이전 플래그를 리턴
=> 포맷 플래그는 한 번 설정하면 해제할 때까지 유지
포맷 함수 활용
(1) int width(int minwidth) : 출력되는 필드의 최소 너비를 minwidth로 설정하고 이전에 설정된 너비값 리턴
(2) char fill(char cfill) : 필드의 빈칸을 cfill문자로 채우도록 지정하고 이전 문자 값 리턴
(3) int precision(int np) : 출력되는 수의 유효숫자 자리수를 np개로 설정. 정수 부분과 소수점 이하의 수의 자리를 모두 포함하고 소수점(.)은 제외
조작자 - 조작자는 함수, 항상 << 나 >> 연산자와 함께 사용됨
(1) 매개 변수 없는 조작자
조작자 | I/O | 용도 |
---|---|---|
endl | O | 스트림 버퍼를 모두 출력하고 다음 줄로 넘어감 |
oct | O | 정수 필드를 8진수 기반으로 출력 |
dec | O | 정수 필드를 10진수 기반으로 출력 |
hex | O | 정수 필드를 16진수 기반으로 출력 |
left | O | 왼쪽 맞춤으로 출력 |
right | O | 오른쪽 맞춤으로 출력 |
fixed | O | 실수 필드를 고정 소수점 방식으로 출력 |
scientific | O | 실수 필드를 과학 산술용 방식으로 출력 |
flush | O | 스트림 버퍼 강제 출력 |
showbase | O | 16진수의 경우 0x로, 8진수의 경우 0을 앞에 붙여서 출력 |
noshowbase | O | showbase지정 취소 |
showpoint | O | 실수 값에 대해, 정수 부분과 소수점 이하의 끝자리 이후 남은 공간을 0으로 출력 |
noshowpoint | O | showpoint 지정 취소 |
showpos | O | 양수인 경우 + 부호를 붙여 출력 |
skipws | I | 입력 스트림에서 공백 문자를 읽지않고 건너뜀 |
noskipws | I | skipws지정취소 |
boolalpha | O | 불린 값이 출력될 때, "true"혹은 "false"문자열로 출력 |
(2) 매개 변수를 가진 조작자
조작자 | I/O | 용도 |
---|---|---|
resetioflags(long flags) | IO | flags에 지정된 플래그들 해제 |
setbase(int base) | O | base를 출력할 수의 진수로 지정 |
setfill(char cFill) | I | 필드를 출력하고 남은 공간에 cFIll문자로 채움 |
setioflags(long flags) | IO | flags를 스트림 입출력 플래그로 설정 |
setprecision(int np) | O | 출력되는 수의 유효숫자 자리수를 np개로 설정. 소수점(.)은 별도의 카운트 |
setw(int minWidth) | O | 필드의 최소 너비를 minWidth로 지정 |
11. 삽입 연산자(<<) - insertion operator, 삽입자라고도 부름 / ostream 클래스에서 중복 작성되어 있음
12. 사용자 삽입 연산자 만들기 => 클래스 private 멤버변수 사용한다면 friend 키워드 필수
ostream& operator << (ostream& stream, Point a) {
stream << "(" << a.x << "," << a.y << ")";
return stream;
}
13.추출 연산자(>>) - extraction operator / istream 클래스에서 중복 작성되어 있음
14. 사용자 추출 연산자 만들기 => 클래스 private 멤버 변수 사용한다면 friend 키워드 필수
istream& operator >> (istream& ins, Ponit &a) {
cout << "x 좌표>>";
ins >> a.x;
cout << "y 좌표>>";
ins >> a.y;
return ins;
}