11장 C++ 입출력 시스템
1. 스트림 : 데이터의 흐름, 혹은 데이터를 전송하는 소프트웨어 모듈
- 스트림의 양 끝에는 프로그램과 장치 연결, 보낸 순서대로 데이터 전달
- 입출력 기본 단위 : 바이트
- 종류
- 입력 스트림 : 입력 장치, 네트워크, 파일로부터 데이터를 프로그램으로 전달하는 스트림
- 출력 스트림 : 프로그램에서 출력되는 데이터를 출력 장치, 네트워크, 파일로 전달하는 스트림
2. C++ 입출력 스트림 버퍼
1) 키 입력 스트림의 버퍼 - 입력 장치로부터 입력된 데이터를 프로그램으로 전달하기 전에 일시 저장
- 키 입력 도중 수정 가능 : 백스페이스 키가 입력되면 이전에 입력된 키를 버퍼에서 지움
- 프로그램은 사용자의 키 입력이 끝난 시점에서 읽음
- 엔터키 : 키 입력의 끝을 의미
- 엔터키가 입력된 시점부터 키 입력 버퍼에서 프로그램이 읽기 시작
2) 스크린 출력 스트림 버퍼 - 프로그램에서 출력된 데이터를 출력 장치로 보내기 전에 일시 저장
- 버퍼가 꽉 차거나 강제 출력 명령 시에 출력 장치에 출력
3. C++ 표준은 스트림 입출력만 지원
스트림 입출력 방식(stream I/O) : 스트림 버퍼를 이용한 입출력 방식
- 입력된 키는 버퍼에 저장 - 엔터 키가 입력되면 프로그램이 버퍼에서 읽어가는 방식
- 출력되는 데이터는 일차적으로 스트림 버퍼에 저장 -> 버퍼가 꽉 차거나, '\n'을 만나거나, 강제 출력 명령의 경우에만 버퍼가 출력 장치에 출력
4. 표준 입출력 스트림 객체
C++ 프로그램이 실행될 때 자동으로 생겨나는 스트림
- cin : istream 타입의 스트림 객체로서 키보드 장치와 연결
- cout : ostream 타입의 스트림 객체로서 스크린 장치와 연결
- cerr : ostream 타입의 스트림 객체로서 스크린 장치와 연결
- 오류 메시지를 출력할 목적, 스트림 내부 버퍼 거치지 않고 출력
- clog : ostream 타입의 스트림 객체로서 스크린 장치와 연결
- 오류 메시지를 출력할 목적, 스트림 내부에 버퍼 거쳐 출력
5. ostream 멤버 함수
- ostream& put(char ch) : ch의 문자를 스트림에 출력
- ostream& write(char* str, int n) : str 배열에 있는 n 개의 문자를 스트림에 출력
- ostream& flush() : 현재 스트림 버퍼에 있는 내용 강제 출력
6. istream 멤버 함수 - 문자 입력, get() 함수
- int get() : 입력 스트림에서 문자를 읽어 리턴. 오류나 EOF를 만나면 -1(EOF) 리턴
- istream& get(char& ch) : 입력 스트림에서 문자를 읽어 ch에 저장. 현재 입력 스트림 객체(*this)의 참조 리턴. 오류나 EOF를 만나면, 스트림 내부의 오류 플래그(failbit) 세팅
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. 한 줄 읽기
- istream& get(char* s, int n, char delim='\n') - '\n' 문자 버퍼에 남겨둠
- istream& getline(char* s, int n, char delim='\n') - get()과 동일, 하지만 delim에 지정된 구분 문자를 스트림에서 제거
9. 입력 문자 건너 띄기와 문자 개수 알아내기
- istream& ignore(int n=1, int delim=EOF) - 입력스트림에서 n개 문자 제거. 도중에 delim 문자를 만나면 delim문자를 제거하고 리턴
- int gcount() - 최근에 입력 스트림에서 읽은 바이트 수(문자의 개수) 리턴. 키도 개수에 포함
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;
}
Author And Source
이 문제에 관하여(11장 C++ 입출력 시스템), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rosesua318/11장-C-입출력-시스템저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)