금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하
15 강. 표준입출력목차 C++ 입출력클래스 입출력형식설정방법 setf, unsetf 멤버함수에의한입출력형식설정 setf 이외의멤버함에의한입출력형식설정 입출력조작자에의한입출력형식설정 문자및문자열입출력멤버함수 문자단위입출력 줄단위입력 입출력스트림상태 string 클래스 complex 클래스 1 /17
15 강. 표준입출력 C++ 입출력클래스 C++ 입출력관련클래스구성도 ios_base ios 상속 입출력형식설정 입출력형식설정 표준입력 (cin) istream ostream 표준출력 (cout) iostream 파일입력 ifstream ofstream 파일출력 파일입출력 fstream 본강좌 : cin, cout 사용방법 입출력형식설정, 멤버함수사용 2 /17 파일입출력시에도동일사용가능
15 강. 표준입출력입출력형식설정방법 입출력형식이란? 정수출력시 16진수로출력하고싶은데, 8진수로출력하고싶은데 실수출력시 총 6자리만찍고싶은데 bool 값입력, 출력시 1, 0이아니고 true, false로입력또는출력하고싶은데 입출력형식설정방법 멤버함수이용 입출력조작자이용 3 /17
15 강. 표준입출력입출력형식설정방법 입출력형식설정원리 ios_base 클래스내에각종형식을표현할수있는변수존 재 비트별로특정서식에대한값을유지 setf, unsetf 멤버함수 특정비트값을변경하는방법 setf : 해당비트값을 1(set) 로변경하는함수 01 0 10 16 진수 8 진수 10 진수 unsetf : 해당비트값을 0(reset) 으로변경하는함수 cout.setf(4); // 100 cout.unsetf(1); // 001 cout.setf(ios_base::hex); cout.unsetf(ios_base::dec); 4 /17 각종서식의값이 const 문자열상수로선언되어있음
15 강. 표준입출력입출력형식설정방법 setf, unsetf 멤버함수사용예 void main(void) { cout.setf(ios_base::hex); cout.unsetf(ios_base::dec); cout.setf(ios_base::showbase); cout.setf(ios_base::boolalpha); cout.setf(ios_base::showpoint); int a = 16; bool b = true; double c = 3; 정수 : 16진수출력켜기정수 : 10진수출력끄기정수 : 진법표기 bool : true, false 출력실수 : 소수점표기 cout << a << endl; cout << b << endl; cout << c << endl; 5 /17
15 강. 표준입출력입출력형식설정방법 6 /17 또다른 setf 함수 정수진법의경우 dec, oct, hex 중하나만켜져야함 cout.setf(ios_base::hex, ios_base::basefield) 진법표기중 16 진수만켜지고나머지는꺼짐 void main(void) 정수 : 진법표기 (hex, oct, dec) { cout.setf(ios_base::hex, ios_base::basefield); cout.setf(ios_base::scientific, ios_base::floatfield); cout.setf(ios_base::right, ios_base::adjustfield); int a = 16; double b = 123.456; cout << a << endl; cout << b << endl; 실수 : 소수점표기법 (fixed), 과학적표기법 (scientific) 해당필드기준정렬방법 : left, right, internal 필드크기설정하는 함수 (width) 와함께사용
15 강. 표준입출력입출력형식설정방법 하나의비트만으로설정할수없는형식 출력대상필드크기, 공백자리의채움문자, 실수출력자 리수 각각전용멤버함수를사용하여지정 void main(void) { cout.width(10); cout << "hello" << endl; cout.fill('%'); cout.width(20); cout << "hello" << endl; 출력필드크기설정 : 디폴트오른쪽정렬 공백자리채움문자설정 cout.precision(6); cout << 123.123456 << endl; 실수 : 총 6 자리출력 7 /17
15 강. 표준입출력입출력형식설정방법 입출력조작자란? <<, >> 입출력연산자와함께사용, 입출력형식을설정하는방법 cout << oct << 16 << hex << 16 << endl; oct, hex 가바로입출력조작자! 입출력조작자의동작원리 cout << hex cout.operator<<(hex) << 연산자오버로딩호출 hex(cout) 매개변수로넘어온함수 (hex) 실행 cout.setf(ios_base::hex, ios_base::basefield) 함수내에서자신의서식설정 8 /17
15 강. 표준입출력입출력형식설정방법 입출력조작자사용예 #include <iostream> #include <iomanip> using namespace std; setfill,setw 입출력조작자포함 void main(void) hex : 16진수출력, oct : 8진수출력, dec : 10진수출력 { cout << hex << 16 << endl; cout << oct << 16 << endl; cout << dec; cout << 16 << setfill('x') << setw(10) << endl; cout << 16 << " hi " << endl; setfill : 채움문자설정 setw : 출력필드크기설정, 한번적용후 reset 9 /17
15 강. 표준입출력문자및문자열입출력멤버함수 istream 클래스의문자입력함수 int get(void); istream &get(char &); ostream 클래스의문자출력함수 ostream &put(char); 예 : 키보드입력을 그대로화면에출력 void main(void) { char ch; cin.get(ch); 파일의끝이아닌동안 키보드입력의경우 Ctrl+z 10 /17 while (!cin.eof()) { cout.put(ch); ch = cin.get();
15 강. 표준입출력문자및문자열입출력멤버함수 istream 클래스의줄단위문자열입력함수 istream &getline(char *, int, char = \n ); 최대개수 (int) 만큼읽어저장 (char *) 하되종료문자 ( \n ) 가 나타나면입력종료 입력후종료문자 ( \n ) 는제거 void main(void) { char str[80]; cout << " 문자열입력 : "; cin.getline(str, 80, '*'); cout << " 읽어들인문자열 : " << str << endl; cout << " 다음문자는 : " << (char) cin.get() << endl; 11 /17
15 강. 표준입출력입출력스트림상태 입출력수행에따른현재상태저장 ios_base 클래스내의변수에저장 입출력스트림상태의종류 상태 열거값 설명 접근멤버함 수 goodbit 0 eofbit, failbit, badbit 모두 0 good() eofbit 1 파일의끝에도달 eof() failbit 2 치명적이지않은입출력에러 - 지정한타입의값을읽을수없음 - 접근할수없는파일읽기 goodbit 상태로복원 : cin.clear() fail() badbit 4 치명적인입출력에러 bad() 12 /17
15 강. 표준입출력입출력스트림상태 failbit 상태의예 : 원하는데이터를읽지못함 void main(void) { int a; cout << " 정수입력 : "; cin >> a; if (cin.fail()) cout << "fail" << endl; else cout << "not fail" << endl; 정수를읽지못함 : failbit cin.clear(); goodbit 상태로복원 13 /17 if (cin.fail()) cout << "fail" << endl; else cout << "not fail" << endl;
15 강. 표준입출력 string 클래스 string 클래스 표준 C++ 에서제공하는문자열처리클래스 <string> 헤더파일에포함 주요기능 = : 대입연산 +, += : 문자열결합 ==,!=, <, >, <=, >= : 상등및대소비교 >>, << : 입출력연산 [ ], append, insert, erase, replace, find, rfind, compare, swap 14 /17
15 강. 표준입출력 string 클래스 #include <iostream> #include <string> using namespace std; string 클래스포함 void main(void) + : 문자열연결 { string str1 = "Hello! "; string str2 = "Programming"; string str3 = str1 + str2; string str4 = "C++ "; 15 /17 cout << "str1 : " << str1 << endl; cout << "str2 : " << str2 << endl; cout << "str3 : " << str3 << endl; cout << "str4 : " << str4 << endl << endl; str3.insert(7, str4); str3의 7번째위치에 str4의내용을삽입 cout << "str3 : " << str3 << endl << endl; str3.swap(str4); str3와 str4의내용을맞교환 cout << "str3 : " << str3 << endl; cout << "str4 : " << str4 << endl;
15 강. 표준입출력 complex 클래스 16 /17 complex 클래스 복소수를표현하는클래스 : a + bi (a : 실수부, b : 허수부 ) <complex> 헤더파일에포함 클래스템플릿으로구현 주요기능 기능 연산자 의미 (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)/(c2 + d2) + {(bc - ad)/(c2 + d2)i 대입 = 상등비교 ==,!= 입출력 >>, <<
15 강. 표준입출력 complex 클래스 complex 클래스사용예 #include <iostream> #include <complex> using namespace std; void main(void) { 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; 17 /17