입출력 C++ 의효율적인입출력방법을배워보자.
이장에서다룰내용 1 cin 과 cout 을이용한입출력 2 입출력연산자중복 3 조작자생성 4 파일입출력
01_cin 과 cout 을이용한입출력 포맷입출력 C++ 의표준입출력은 cin, cout 을사용한다. C 의 printf 는함수이므로매번여러인자를입력해줘야하지만, cin/cout 에서는형식을한번만정의하면계속사용할수있다. setf : 형식을정의 fmtflags setf ( fmtflags fmtfl ); 참고 : void unsetf ( fmtflags mask );
[ 기본예제 11-1] 포맷입출력 01 #include<iostream> 02 using namespace std; 03 int main(int argc, char* argv[]) 04 { 05 cout << 123.23 << "hello" << 100 << '\n'; 06 07 cout.setf(ios::hex); // 상황에따라, cout.setf(ios::dec); 해주어야함 // cout.setf(ios_base::hex, ios_base::basefield); 또는 cout << hex 08 cout << 123.23 << "hello" << 100 << '\n'; 09 10 cout.setf(ios::scientific); // cout.setf(ios_base::scientific, ios_base::floatfield); 11 cout << 123.23 << "hello" << 100 << '\n'; 12 cout.setf(ios::uppercase); // 13 cout << 123.23 << "hello" << 100 << '\n'; 14 15 return 0; 16 } 16 진수로표시한다. 실수를과학용 과학용표기로 표기로출력한다. 진수나과학용표기에대문자로출력한다. 표기에대한 대한문자들을
01_cin 과 cout 을이용한입출력 cout 의멤버함수 cout 은함수가아닌객체이므로, 멤버함수를가지고있다. cout 의멤버함수를익혀서출력형식에변화를줘보자. 멤버함수의종류
[ 기본예제 11-2] cout 멤버함수 01 #include<iostream> 02 using namespace std; 03 int main(int argc, char* argv[]) 04 { 05 cout.width(10); 06 cout << "...test..." << "\n"; 07 08 cout.fill('-'); 09 cout.width(20); 10 cout << "...test..." << "\n"; 11 12 cout.setf(ios::left); // cout.setf(ios_base::left, ios_base::adjustfield); 13 cout.width(20); 14 cout << "...test..." << "\n"; 15 16 cout.precision(10); 17 cout.width(20); 18 cout << 3.14159265 << "\n"; 19 20 cout.precision(5); 21 cout.width(20); 22 cout << 123.234567 << "\n"; 23 return 0; 24 } 빈자리를 - 로채우고, 너비를 20 으로설정한다. 좌측으로정렬시킨다. 10 자리가너비를 20 자리가출력되도록 출력되도록설정하고, 20 으로 으로설정한다. 5 자리가출력되도록너비를 20 으로 출력되도록설정하고, 으로설정한다.
01_cin 과 cout 을이용한입출력 cout 의조작자 지금까지배운 setf 나다른멤버함수들이외에조작자를이용해서보다간단하게출력형태를바꿀수있다. 조작자의종류 참고. 조작자를사용하려면 iomanip 를 include 해야한다.
[ 기본예제 11-3] 조작자예제 01 #include<iostream> 02 #include<iomanip> 03 using namespace std; 04 int main(int argc, char* argv[]) 05 { 06 cout << hex << 100 << endl; 07 cout << oct << 100 << endl; 08 cout << setfill('-') << setw(10); 09 cout << "hello" << endl; 10 return 0; 11 } 16 진수로표시한다. 8 진수로표시한다. 빈자리를 - 로채우고, 너비를 10 으로설정한다.
02_ 입출력연산자중복 출력연산자중복 입출력연산자도중복이가능하다. 출력연산자인 << 를중복하기위해서는다음형식을사용한다. ostream 은이입출력두번째매개변수는 ostream 형인 stream 입출력연산자는멤버중복하도록한다. 입출력연산자가 매개변수는출력될 연산자가출력 출력될객체를 stream 에대한 멤버함수가 출력연산자라는 객체를입력 대한참조를 연산자라는것을 입력받으며 참조를반환한다. 함수가될수없으며 것을의미하고, 받으며, 작업을 없으며, friend 작업을모두, friend 함수를 모두마친 마친뒤에는 함수를이용해서
[ 기본예제 11-4] 출력연산자중복 01 #include<iostream> 02 using namespace std; 03 class Unit { 04 int x,y; 05 public: 06 Unit() { x=0; y=0; } 07 Unit(int i, int j) { x=i; y=j; } 08 friend ostream &operator<<(ostream &stream, Unit unit); 09 }; 10 11 ostream &operator<<(ostream &stream, Unit unit) 12 { 13 stream << unit.x << ", " << unit.y << endl; 14 return stream; 15 } 16 17 int main(int argc, char* argv[]) 18 { 19 Unit a(10,10), b(1,23); 20 cout << a << b; 21 return 0; 22 } 출력연산자를선언한다. 연산자를 friend friend 함수로 출력연산자를구현한다.
02_ 입출력연산자중복 입력연산자중복 출력연산자를중복한것과유사하게, 입력연산자도중복할수있다. istream 첫번째두번째 istream 을이용하여 이용하여참조를 번째입력인자가 입력인자가 istream 번째입력인자는 입력인자는입력을 참조를반환하며, istream 에대한 대한참조이다. 입력을받아들이는 받아들이는객체에 객체에대한 대한참조이다.
[ 기본예제 11-5] 입력연산자중복 01 #include<iostream> 02 using namespace std; 03 class Unit { 04 int x,y; 05 public: 06 Unit() { x=0; y=0; } 07 Unit(int i, int j) { x=i; y=j; } 08 friend ostream &operator<<(ostream &stream, Unit unit); 09 friend istream &operator>>(istream &stream, Unit &unit); 10 }; 18 istream &operator>>(istream &stream, Unit &unit) 19 { 20 cout << "Enter x,y : "; 21 stream >> unit.x; 22 stream >> unit.y; 23 return stream; 24 } 25 26 int main(int argc, char* argv[]) 27 { 28 Unit a(10,10), b(1,23), c; 29 cout << a << b; 30 31 cin >> c; 32 cout << c; 33 return 0; 34 } 입력연산자를선언한다. 연산자를 friend friend 함수로 입력연산자를구현한다.
03_ 조작자생성 C++ 에서는입출력연산자를중복하는것뿐만아니라, 자신만을위한조작자역시생성할수있다. 출력조작자는다음과같은일반적인형태를갖는다. Manipulator 는생성할조작자의이름을의미한다. 입력조작자는다음과같은일반적인형태를갖는다.
[ 기본예제 11-6] 조작자생성 01 #include<iostream> using namespace std; 02 ostream &mysetup(ostream &stream) 03 { 04 stream.width(10); 05 stream.precision(4); 06 stream.fill('*'); 07 return stream; 08 } 09 int main(void) 10 { 11 cout << mysetup << 123.123456; 12 return 0; 13 } 조작자를생성한다. 정의한조작자를사용한다.
04_ 파일입출력 파일에대한입출력방법도화면입출력방법과크게다르지않다. 파일입출력을위하여 fstream 를포함하고, 파일입출력객체를만들고, 운하는입출력연산을수행시킨다. 파일을열때주로사용하는속성들은다음과같다.
[ 기본예제 11-8] 파일입출력 01 #include <fstream> 02 using namespace std; 03 int main(int argc, char* argv[]) 04 { 05 ofstream file1("log1.txt"); 06 file1 << "this is a log file 1."; 07 file1.close(); 08 09 ofstream file2; 10 file2.open("log2.txt"); 11 file2 << "this is a log file 2."; 12 file2.close(); 13 14 return 0; 15 } 파일을연다. 파일에내용을출력한다. 파일을닫는다. 다른파일을연다. 파일에내용을출력한다. 파일을닫는다.
[ 기본예제 11-9] 파일복사 01 #include <fstream> 02 using namespace std; 03 int main(int argc, char* argv[]) 04 { 05 ifstream file1; 06 ofstream file2; 07 char data; 08 09 file1.open("before.txt", ios::binary ); 10 file2.open("after.txt", ios::binary ); 11 // ios::binary 대신 ios_base::binary 12 while( file1.get( data ) ) { 13 file2.put( data ); 14 } 15 16 file1.close(); 17 file2.close(); 18 19 return 0; 20 } 2 진모드로 모드로입력 입력파일을 파일을연다. 2 진모드로출력파일을연다. 입력파일의내용을출력파일에쓴다. 파일객체들을닫는다.
예제모음 _20 의요구사항및실행결과 요구사항 1 다음과같은사각형클래스가있다. class Rectangle { int height, width; // height: 높이, width: 밑변의길이 public: Rectangle() { height=0; width=0; } Rectangle(int x, int y) { height=y; width=x; } }; 2 이사각형클래스의정보를곧바로 cout 으로출력할수있도록출력연산자를중복하라. 3 사각형에대한정보는높이, 밑변의길이, 면적을출력하도록한다. 실행결과
예제모음 _20 소스 01 #include<iostream> 02 using namespace std; 03 class Rectangle { 04 05 int height, width; 06 public: 07 Rectangle() { height=0; width=0; } 08 Rectangle(int x, int y) { height=y; width=x; } 09 friend ostream &operator<<(ostream &stream, Rectangle rect); 10 }; 11 12 ostream &operator<<(ostream &stream, Rectangle rect) 13 { 14 stream << "width : " << rect.width << 15 ", height : " << rect.height << 16 ", area : " << rect.height*rect.width << endl; 17 return stream; 18 } 19 20 int main(int argc, char* argv[]) 21 { 22 Rectangle a(4,5); 23 cout << a; 24 return 0; 25 } Height 는높이, Width 는밑변의길이를의미한다. 출력연산자를중복한다. 출력연산자를사용한다.
예제모음 _21 의요구사항및실행결과 요구사항 1 다음과같은사각형클래스가있다. class Rectangle { int height, width; // height: 높이, width: 밑변의길이 public: Rectangle() { height=0; width=0; } Rectangle(int x, int y) { height=y; width=x; } }; 2 이사각형클래스의정보를쉽게 cin 으로입력할수있도록입력연산자를중복하라. 3 사각형에대한정보는높이, 밑변의길이를입력받도록하며, 입력받는즉시면적을구하여화면에출력하도록한다. 실행결과
예제모음 _21 소스 01 #include<iostream> 02 using namespace std; 03 class Rectangle { 04 05 int height, width; 06 public: 07 Rectangle() { height=0; width=0; } 08 Rectangle(int x, int y) { height=y; width=x; } 09 void show() { cout << "area : " << height * width << endl; } 10 friend istream &operator>>(istream &stream, Rectangle &rect); 11 }; 12 13 istream &operator>>(istream &stream, Rectangle &rect) 14 { 15 cout << "enter width & height : "; 16 stream >> rect.width; 17 stream >> rect.height; 18 return stream; 19 } 20 21 int main(int argc, char* argv[]) 22 { 23 Rectangle a; 24 cin >> a; 25 a.show(); 26 27 return 0; 28 } Height 는높이, Width 는밑변의길이를의미한다. 입력연산자를중복한다. 입력연산자를사용한다.
예제모음 _22 의요구사항및실행결과 요구사항 1 다음과같은사각형클래스가있다. class Rectangle { int height, width; // height: 높이, width: 밑변의길이 char name[255]; // name: 사각형이름 public: Rectangle() { height=0; width=0; }}; 2 이사각형클래스의정보를쉽게 cin 으로입력할수있도록입력연산자를중복하라. 3 사각형에대하여사각형의이름, 높이, 밑변의길이를입력받으면, 사각형에대한정보를파일에출력하며, 파일명은입력받은사각형의이름을이용하도록한다. 실행결과
예제모음 _22 소스 #1 01 #include<iostream> 02 #include<fstream> 03 using namespace std; 04 class Rectangle { 05 int height, width; // height : 높이, width : 밑변의길이 06 char name[255]; // name : 사각형의이름 07 public: 08 Rectangle() { height=0; width=0; } 09 void write() { 10 ofstream file; 11 file.open( name ); 12 13 file << "name : " << name << endl; 14 file << "width : " << width << endl; 15 file << "height : " << height << endl; 16 17 file.close(); 18 } 19 friend istream &operator>>(istream &stream, Rectangle &rect); 20 }; 21 22 istream &operator>>(istream &stream, Rectangle &rect) 23 { 24 cout << "enter namd, width & height : "; 25 stream >> rect.name; 26 stream >> rect.width; 27 stream >> rect.height; 28 return stream; 29 } 사각형의정보를파일에출력한다. 입력연산자를중복한다.
예제모음 _22 소스 #2 30 31 int main(int argc, char* argv[]) 32 { 33 Rectangle a; 34 cin >> a; 35 a.write(); 36 37 return 0; 38 } 입력연산자를사용한다. 파일에정보를출력한다.
요약 #1 C++ 입출력 cout 의멤버함수 cout 의조작자 C++ 에서는입출력을위해 cin, cout 을제공하며, 멤버함수와조작자를이용하여좀더편하게제어할수있다.
요약 #2 출력연산자의중복 입력연산자의중복 파일입출력 C++ 에서의파일입출력은 cin, cout 과거의유사하다. 다만, iostream 대신에 fstream 를포함하고, 파일입력의경우에는 ifstream, 출력의경우에는 ofstream 객체를생성해서사용하면된다. 파일입출력과관련된주요속성들은다음과같다.
www.themegallery.com IT CookBook for Beginner, C++ 기초 기초 11 11 장끝