11 장표준라이브러리와표준입출력 C++ 표준라이브러리의구성 C++ 입출력클래스 setf와 unsetf 멤버함수를이용한입출력형식지정 setf 이외의멤버함수를이용한입출력형식지정입출력조작자를이용한입출력형식지정사용자정의입출력조작자의생성문자단위입출력줄단위입출력입출력스트림상태 string 클래스 complex 클래스 C++ 프로그래밍입문
1. C++ 표준라이브러리의구성 C++ 표준라이브러리의구성 본교재를통해소개할라이브러리 범주설명예관련장 / 절 입출력 표준입출력 파일입출력 ostream ofstream 11.2~11.9 절 12 장 문자열문자열처리 string 11.10 절 수치계산수치계산관련 complex 11.11 절 컨테이너클래스다양한자료구조 vector 이터레이터 컨테이너클래스 요소포인터 iterator 13 장 알고리즘범용함수 sort 메모리메모리동적할당 auto_ptr 15.1 절 타입타입정보 typeid 15.4 절 11 장표준라이브러리와표준입출력 1
2. C++ 입출력클래스 C 스타일의입출력 : printf, scanf, fprintf, fscanf 등 <cstdio> 헤더파일에포함되어있음 C++ 입출력관련클래스 템플릿클래스 8 비트문자기반클래스와이드문자기반클래스 basic_streambuf streambuf wstreambuf ios_base ( 비템플릿 ) ios_base ios_base basic_ios ios wios basic_istream istream wistream basic_ostream ostream wostream basic_filebuf filebuf wfilebuf basic_ifstream ifstream wifstream basic_ofstream ofstream wofstream basic_fstream fstream wfstream 사용방법동일향후로는 8 비트를대상으로설명 11 장표준라이브러리와표준입출력 2
2. C++ 입출력클래스 입출력관련클래스들의구성도 표준입출력클래스들 istream, ostream, iostream 파일입출력클래스들 ifstream, ofstream, fstream 11 장표준라이브러리와표준입출력 3
2. C++ 입출력클래스 입출력메커니즘 표준입출력 ( 키보드, 모니터 ) 과파일입출력 ( 파일 ) 의사용방법유사 표준입출력객체 클래스객체명기능연결장치대응 C 스트림 istream cin 입력키보드 stdin ostream cout 출력모니터 stdout ostream cerr 오류출력모니터 stderr 표준입출력객체는시스템에의해생성됨 입출력 ( 표준, 파일 ) 객체의복사생성및대입불가 ß 복사생성자와대입연산자는 private 멤버로포함되어있음 (ios_base) ostream, istream 구현원리는 7.9 절참고 : 본장에서는사용방법설명 11 장표준라이브러리와표준입출력 4
3. setf 와 unsetf 멤버함수를이용한입출력형식지정 cout : setf와 unsetf를이용한출력형식지정원리 _Fmtfl 변수 ( 출력형식저장 ) 값변경 : 각서식의비트값을 1로변경또는 0으로변경 각서식의의미를열거형값으로선언 ios_base::hex 16 진수출력예 cout.unsetf(ios_base::dec); // 10진수해제 cout.setf(ios_base::hex); // 16진수설정 cout << "16진수 : " << 16 << endl; cout.setf(ios_base::dec); // 10진수설정 cout << "10진수 : " << 16 << endl; 11 장표준라이브러리와표준입출력 5
3. setf 와 unsetf 멤버함수를이용한입출력형식지정 fmtflags setf(fmtflags); 멤버함수의사용 (fmtflags 는 int 형과동일 ) bool btf = true; int i = 16; double d = 12.0; 플래그상수설명용도 boolalpha bool 값을 true 와 false 로표현입출력 showbase 정수값출력시진법표시접두어사용출력 showpoint 실수값출력시소수점표기출력 uppercase 16 진수출력시 X 를대문자로표기실수과학적표기시 E 를대문자로표기 cout << btf << endl; cout << i << endl; cout << d << endl << endl; // 플래그동시설정 cout.setf(ios_base::boolalpha ios_base::showbase ios_base::showpoint ios_base::uppercase ios_base::showpos); 출력 showpos 양수앞에 + 부호표기출력 skipws 입력시공백문자무시 ( 디폴트 On) 입력 cout.unsetf(ios_base::dec); cout.setf(ios_base::hex); // 16 진수설정 cout << btf << endl; cout << i << endl; cout << d << endl; 11 장표준라이브러리와표준입출력 6
3. setf 와 unsetf 멤버함수를이용한입출력형식지정 fmtflags setf(fmtflags, fmtflags); 멤버함수의사용 관련그룹별지정 bool btf = true; int i = 16; double d = 12.0; 첫번째매개변수두번째매개변수설명용도 dec, oct, hex basefield 10 진수, 8 진수, 16 진수표기입출력 fixed, scientific left, right, internal floatfield adjustfield 실수의소수점표기와과학적표기 왼쪽정렬, 오른쪽정렬, 부호와진법접두어는왼쪽정렬이고값은오른쪽정렬 출력 출력 cout << btf << endl; cout << i << endl; cout << d << endl << endl; 16 진수설정 cout.setf(ios_base::boolalpha ios_base::showbase ios_base::showpoint ios_base::uppercase ios_base::showpos); cout.setf(ios_base::hex, ios_base::basefield); cout.setf(ios_base::scientific, ios_base::floatfield); cout << btf << endl; cout << i << endl; cout << d << endl; 과학적표기법 11 장표준라이브러리와표준입출력 7
3. setf 와 unsetf 멤버함수를이용한입출력형식지정 setf 함수의반환값 이전플래그변수 (_Fmtfl) 의값 à 각플래그의상태를알아볼수있음 플래그지정없이플래그변수값을알아오는함수 fmtflags flags(); ios_base::fmtflags flag = cout.flags(); if (flag & ios_base::hex) // 16진수설정여부 cout << "hex on" << endl; else cout << "hex off" << endl; cout.setf(ios_base::hex, ios_base::basefield); flag = cout.flags(); if (flag & ios_base::hex) cout << "hex on" << endl; else cout << "hex off" << endl; 11 장표준라이브러리와표준입출력 8
4. setf 이외의멤버함수를이용한출력형식지정 출력형식지정을위한 ostream 멤버함수 int width(int i) 함수설명디폴트값 최소필드너비조정 조정후첫번째출력후에는디폴트값으로자동환원 출력내용과동일 char fill(char c) 필드내의공백자리에채워질문자설정공백 int precision(int p) 실수출력시출력되는총자릿수, 출력형식이 fixed 또는 scientific 이라면소수점이하자릿수 6 cout.width(10); cout << "hello" << endl; cout.fill('%'); cout.width(10); cout << "hello" << endl << endl; cout.setf(ios::left, ios::adjustfield); cout.width(10); cout << "hello" << endl << endl; 11 장표준라이브러리와표준입출력 cout.width(10); cout.precision(4); cout << 123.1234567 << endl; cout.width(10); cout.precision(6); cout << 123.1234567 << endl; 9
5. 입출력조작자를이용한입출력형식지정 입출력형식지정방법 ostream, istream 클래스의멤버함수사용 : setf, unsetf, width 등 입출력조작자 (io manipulator) 사용 : 동일한효과를낼수있음입출력조작자의사용방법및수행원리 <<, >> 입출력연산자와함께사용하게됨 cout << oct << 100 << hex << 100 << endl; 수행원리 : 내부적으로는결국 ostream, istream 의멤버함수가수행됨 cout << hex의경우 변환수행 : cout.operator<<(hex); 함수호출 : hex(cout); // hex라는함수가수행됨 수행내용 : cout.setf(ios_base::hex); // hex 함수의수행내용 setf, unsetf에해당하는입출력조작자 setiosflags, resetiosflags cout << resetiosflags(ios_base::dec) << setiosflags(ios_base::hex) << 16 << endl; 11 장표준라이브러리와표준입출력 10
5. 입출력조작자를이용한입출력형식지정 입출력조작자의종류 입출력조작자대응서식플래그설명용도 boolalpha noboolalphs showbase noshowbase showpoint noshowpoint uppercase nouppercase showpos noshowpos skipws noskipws dec hex oct fixed scientific left internal right setf(ios_base::boolalpha) unsetf(ios_base:boolalpha) setf(ios_base::showbase) unsetf(ios_base:showbase) setf(ios_base::showpoint) unsetf(ios_base:showpoint) setf(ios_base::uppercase) unsetf(ios_base: uppercase) setf(ios_base::showpos) unsetf(ios_base:showpos) setf(ios_base::skipws) unsetf(ios_base:skipws) setf(ios_base::dec, ios_base::basefield) setf(ios_base::fixed, ios_base::floatfield) setf(ios_base::left, ios_base::adjustfield) bool 값의 true, false 표현 진법표시접두어사용 소수점표기 16 진수 X, 과학적표기 E 대문자사용 양수앞에 + 부호표기 입력시공백문자무시 ( 디폴트값 : On) 진수표기 실수표기 정렬방법 입출력 11 장표준라이브러리와표준입출력 11 출력 출력 출력 출력 입력 입출력 출력 출력
5. 입출력조작자를이용한입출력형식지정 입출력조작자의종류 ( 계속 ) 입출력조작자대응서식플래그설명용도 setw(int) width(int) 필드너비조정, 이후한번의출력후디폴트로환원됨 setfill(char) fill(char) 공백자리채움문자지정출력 setprecision(int) precision(int) 실수출력자릿수설정출력 endl newline 문자출력, 스트림비움출력 flush 스트림을비움출력 setiosflags resetiosflags setf unsetf 출력 #include <iostream> #include <iomanip> using namespace std; // setfill, setw cout << hex << 100 << endl; cout << oct << 10 << endl; // 16진수출력 // 8진수출력 cout << setfill('x') << 100 << setw(10) << endl; // 채움문자, 필드설정 cout << 100 << " hi " << endl; 11 장표준라이브러리와표준입출력 12
6. 사용자정의입출력조작자의생성 입출력조작자 ( 결국함수 ) 의형태 ostream &FuncName(ostream &); // 출력조작자 istream &FuncName(istream &); // 입력조작자 사용자정의조작자의예 ostream &MySetup(ostream &os) // 사용자정의출력조작자 os << "<< 나의입출력조작자 >>" << endl; os.width(10); os.precision(4); os.fill('*'); return os; cout << 123.123456 << endl; cout << MySetup << 123.123456 << endl; 11 장표준라이브러리와표준입출력 13
7. 문자단위입출력 istream 의문자입력함수 int get(void); istream &get(char &); // 연속적인 get 함수적용가능 ostream 의문자출력함수 ostream &put(char); 예 : 키보드입력을그대로화면에출력 char ch; cin.get(ch); while (!cin.eof()) cout.put(ch); ch = cin.get(); // 문자하나입력 // 문자하나출력 // 문자하나입력 파일끝표시 : Ctrl+z 11 장표준라이브러리와표준입출력 14
8. 줄단위입력 istream : 줄단위문자열입력을위한멤버함수 istream &get(char *, int, char = \n ); 최대개수 (int) 만큼입력을받아들이되종료문자 ( \n ) 가나타나면입력종료 입력후종료문자를입력스트림에남겨둠 istream &getline(char *, int, char = \n ); 입력후종료문자를입력스트림으로부터제거 char str[80]; cout << " 문자열입력 : "; cin.getline(str, 80, '*'); cout << " 다음문자는 : " << (char) cin.get() << endl; char str[80]; cin.get(str, 80); cin.getline(str, 80); while ((cin.get())!= '\n'); // 그줄의나머지를읽어들임 cout << " 문자열입력 : "; cin.get(str, 80, '*'); // * 문자전까지입력 cout << " 다음문자는 : " << (char) cin.get() << endl; 11 장표준라이브러리와표준입출력 15
9. 입출력스트림상태 입출력수행에따른현재상태저장 ios_base 클래스내에상태를저장하는변수가있음 iostate _State; ü 실제유의미한비트는하위 3 비트 입출력스트림상태의종류 // iostate 는 int 와동일 상태열거값설명접근함수 goodbit 0 에러가발생하지않았음 eofbit, failbit, badbit 모두 0 인경우 현재상태가 fail 인지알고싶다면 : if (cin.fail()) good() eofbit 1 입력스트림에서파일의끝에도달 eof() failbit 2 badbit 4 치명적이지않은입출력에러발생 지정한타입의값을읽을수없음 접근할수없는파일읽기 쓰기방지된디스켓에쓰기 치명적인입출력에러발생 복구불가능한에러 스트림상태를 goodbit(0) 으로복원하는방법 : cin.clear(); 현재스트림상태값 (_State) 을읽어오는함수 : iostate rdstate() const; 11 장표준라이브러리와표준입출력 16 fail() bad()
9. 입출력스트림상태 예 : 원하는타입의데이터를읽지못한경우 failbit 의값확인 int a; cout << " 정수입력 : "; cin >> a; if (cin.fail()) cout << "fail" << endl; else cout << "not fail" << endl; cin.clear(); if (cin.fail()) cout << "fail" << endl; else cout << "not fail" << endl; 다음장에서배울파일입출력을위해사용가능 à 지금까지배운내용 ( 서식지정, 입출력 ) 모두파일입출력에사용가능 클래스객체에대한출력연산자오버로딩및입력연산자오버로딩 à 7.9 절참고 11 장표준라이브러리와표준입출력 17
10. string 클래스 ( 연습문제 7.14) CString 클래스만들기 내부적으로 char 포인터와문자열길이보관 생성자, 소멸, 복사생성자, 대입연산자, +, <<, +=, ==, >> 연산자오버로딩필요표준 C++ 에서제공하는문자열처리클래스 à string <string> 헤더파일에포함되어있음 주요기능 ( 교재 [ 표 11.9] 참고 ) = : 대입연산 +, += : 문자열결합 ==,!=, <, >, <=, >= : 동등및대소비교 >>, << : 입출력연산 [], append, insert, erase, replace, find, rfind, compare, swap 11 장표준라이브러리와표준입출력 18
10. string 클래스 insert 와 swap 함수의사용예 #include <iostream> #include <string> using namespace std; void Print(string &s1, string &s2, string title) cout << title << endl; cout << "str1 : " << s1 << endl; cout << "str2 : " << s2 << endl; string str1 = "Hello! Programming"; string str2 = "C++ "; Print(str1, str2, "<< 적용전 >>"); str1.insert(7, str2); // 7과 8번째원소사이에삽입 Print(str1, str2, "<< insert >>"); str1.swap(str2); // 문자열교환 Print(str1, str2, "<< swap >>"); 11 장표준라이브러리와표준입출력 19
11. complex 클래스 complex 클래스 : complex 헤더파일에포함되어있음 복소수를표현하는클래스 : a + bi (a: 실수부, b: 허수부 ) 템플릿클래스로구현 주요기능 #include <iostream> #include <complex> using namespace std; complex<double> comp1(1.0, 2.0); complex<double> comp2(3.0, 4.0); cout << "+ : " << comp1 + comp2 << endl; cout << "- : " << comp1 - comp2 << endl; cout << "* : " << comp1 * comp2 << endl; cout << "/ : " << comp1 / comp2 << endl; 기능연산자의미 (X = a + bi, Y = c + di) 덧셈 + X + Y = (a + c) + (b + d)i 뺄셈 - X - Y = (a - c) +(b - d)i 곱셈 * X * Y = (ac - bd) + (ad + bc)i 나눗셈 / 대입 = 상등비교 ==,!= 입출력 >>, << X / Y = (ac + bd)/(c 2 + d 2 ) + (bc - ad)/(c 2 + d 2 )i 11 장표준라이브러리와표준입출력 20