11장 C++ 입출력 시스템

12898 단어 C쁠쁠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::skipwq0x001입력시 공백 문자(스페이스, 탭, 개행문자)를 무시
ios::unitbuf0x002출력 스트림에 들어오는 데이터를 버퍼링하지 않고 바로 출력
ios::uppercase0x000416진수의 A~F. 지수 표현의 E를 대문자로 표현
ios::showbase0x000816진수이면 0x를, 8진수이면 0을 숫자 앞에 붙여 출력
ios::showpoint0x0010실수 값에 대해, 정수 부분과 더불어 소수점 이하의 끝자리들을 0으로 출력
ios::showpos0x0020양수에 대해 + 기호 출력
ios::left0x0040필드를 왼쪽 맞춤(left-aling)형식으로 출력
ios::right0x0080필드를 오른쪽 맞춤(right-aling)형식으로 출력
ios::internal0x0100부호는 왼쪽 맞춤으로 숫자는 오른쪽 맞춤으로 출력
ios::dec0x020010진수로 출력. 디폴트 설정
ios::oct0x04008진수로 출력
ios::hex0x080016진수로 출력
ios::scientific0x1000실수에 대해 과학 산술용 규칙에 따라 출력
ios::fixed0x2000실수에 대해 소수점 형태로 출력
ios::boolalpha0x4000설정되면, 논리값 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용도
endlO스트림 버퍼를 모두 출력하고 다음 줄로 넘어감
octO정수 필드를 8진수 기반으로 출력
decO정수 필드를 10진수 기반으로 출력
hexO정수 필드를 16진수 기반으로 출력
leftO왼쪽 맞춤으로 출력
rightO오른쪽 맞춤으로 출력
fixedO실수 필드를 고정 소수점 방식으로 출력
scientificO실수 필드를 과학 산술용 방식으로 출력
flushO스트림 버퍼 강제 출력
showbaseO16진수의 경우 0x로, 8진수의 경우 0을 앞에 붙여서 출력
noshowbaseOshowbase지정 취소
showpointO실수 값에 대해, 정수 부분과 소수점 이하의 끝자리 이후 남은 공간을 0으로 출력
noshowpointOshowpoint 지정 취소
showposO양수인 경우 + 부호를 붙여 출력
skipwsI입력 스트림에서 공백 문자를 읽지않고 건너뜀
noskipwsIskipws지정취소
boolalphaO불린 값이 출력될 때, "true"혹은 "false"문자열로 출력

(2) 매개 변수를 가진 조작자

조작자I/O용도
resetioflags(long flags)IOflags에 지정된 플래그들 해제
setbase(int base)Obase를 출력할 수의 진수로 지정
setfill(char cFill)I필드를 출력하고 남은 공간에 cFIll문자로 채움
setioflags(long flags)IOflags를 스트림 입출력 플래그로 설정
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;
}

좋은 웹페이지 즐겨찾기