第11章C++I/Oシステム(まとめ例)


1.例11-1:ostreamメンバー関数を使用して文字を出力する
#include <iostream>
using namespace std;

int main() {
    // "Hi!"를 출력하고 다음 줄로 넘어간다.
    cout.put('H');
    cout.put('i');
    cout.put(33); // ASCII 코드 33은 '!' 문자임
    cout.put('\n');

    // "C++"을 출력한다.
    cout.put('C').put('+').put('+').put(' ');

    char str[] = "I love programming";
    cout.write(str, 6); // str 배열의 6개의 문자 "I love"를 스트림에 출력
}

2.例11-2:get()とget(char&)を使用して1行の文字を読み込む
#include <iostream>
using namespace std;

void get1() {
    cout << "cin.get()로 <Enter> 키까지 입력 받고 출력합니다>>";
    int ch; // EOF와의 비교를 위해 int 타입으로 선언
    while ((ch = cin.get()) != EOF) { // 문자 읽기. EOF는 -1
        cout.put(ch); // 읽은 문자 출력
        if (ch == '\n') break; // <Enter> 키가 입력되면 읽기 중단
    }
}

void get2() {
    cout << "cin.get(char&)로 <Enter>키까지 입력 받고 출력합니다>>";
    char ch;
    while (true) {
        cin.get(ch); // 문자 읽기
        if (cin.eof()) break; // EOF를 만나면 읽기 종료
        cout.put(ch); // ch의 문자 출력
        if (ch == '\n') break; // <Enter> 키가 입력되면 읽기 중단
    }
}

int main() {
    get1(); // cin.get()을 이용하는 사례
    get2(); // cin.get(char&)을 이용하는 사례
}

3.使用例11-3-:get(char*,int)入力文字列
#include <iostream>
#include <string>
using namespace std;

int main() {
    char cmd[80];
    cout << "cin.get(char*, int)로 문자열을 읽습니다." << endl;
    while (true) {
        cout << "종료하려면 exit을 입력하세요 >> ";
        cin.get(cmd, 80); // 79개까지의 영어 문자 읽음.
        if (strcmp(cmd, "exit") == 0) {
            cout << "프로그램을 종료합니다....";
            return 0;
        }
        else
            cin.ignore(1); // 버퍼에 남아있는 <Enter> 키 ('\n') 제거
    }
}

4.例11-4:getline()行読み出し
#include <iostream>
using namespace std;

int main() {
    char line[80];
    cout << "cin.getline() 함수로 라인을 읽습니다." << endl;
    cout << "exit를 입력하면 루프가 끝납니다." << endl;

    int no = 1; // 라인 번호
    while (true) {
        cout << "라인 " << no << ">> ";
        cin.getline(line, 80); // 79개까지의 문자 읽음
        if (strcmp(line, "exit") == 0)
            break;
        cout << "echo --> ";
        cout << line << endl; // 읽은 라인을 화면에 출력
        no++; // 라인 번호 증가
    }
}

5.例11-5:setf()およびunsetf()出力フォーマットを使用する
#include <iostream>
using namespace std;

int main() {
    cout << 30 << endl; // 10진수로 출력

    cout.unsetf(ios::dec);  // 10진수 해제
    cout.setf(ios::hex); // 16진수로 설정
    cout << 30 << endl;

    cout.setf(ios::showbase); // 16진수로 설정
    cout << 30 << endl;

    cout.setf(ios::uppercase); // 16진수의 A~F는 대문자로 출력
    cout << 30 << endl;

    cout.setf(ios::dec | ios::showpoint); // 10진수 표현과 동시에 소숫점 이하 나머지는 0으로 출력
    cout << 23.5 << endl;

    cout.setf(ios::scientific); // 실수를 과학산술용 표현으로 출력
    cout << 23.5 << endl;

    cout.setf(ios::showpos); // 양수인 경우 + 부호도 함께 출력
    cout << 23.5;
}

6.使用例11-6:width()、fill()およびprecision()出力フォーマット
#include <iostream>
using namespace std;

void showWidth() {
    cout.width(10); // 다음에 출력되는 "hello"를 10 칸으로 지정
    cout << "Hello" << endl;
    cout.width(5); // 다음에 출력되는 정수 12를 5 칸으로 지정
    cout << 12 << endl;

    cout << '%';
    cout.width(10); // 다음에 출력되는 "Korea/"만 10 칸으로 지정
    cout << "Korea/" << "Seoul/" << "City" << endl;
}

int main() {
    showWidth();
    cout << endl;

    cout.fill('^');
    showWidth();
    cout << endl;

    cout.precision(5);
    cout << 11. / 3. << endl;
}

7.例11-7:無パラメータオペレータの使用
#include <iostream>
using namespace std;

int main() {
    cout << hex << showbase << 30 << endl;
    cout << dec << showpos << 100 << endl;
    cout << true << ' ' << false << endl;
    cout << boolalpha << true << ' ' << false << endl;
}

8.例11-8:パラメータを使用したオペレータの例
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    cout << showbase;

    // 타이틀을 출력한다.
    cout << setw(8) << "Number";
    cout << setw(10) << "Octal";
    cout << setw(10) << "Hexa" << endl;

    // 하나의 수를 십진수, 8진수 16진수 형태로 한 줄에 출력한다.
    for (int i = 0; i < 50; i += 5) {
        cout << setw(8) << setfill('.') << dec << i; // 10진수
        cout << setw(10) << setfill(' ') << oct << i; // 8진수
        cout << setw(10) << setfill(' ') << hex << i << endl; // 16진수
    }
}

9.例11-9:Pointオブジェクトをストリームに出力する<<演算子を作成する
#include <iostream>
using namespace std;

class Point { // 한 점을 표현하는 클래스
    int x, y; // private 멤버
public:
    Point(int x = 0, int y = 0) {
        this->x = x;
        this->y = y;
    }
    friend ostream& operator << (ostream& stream, Point a);
};

// << 연산자 함수
ostream& operator << (ostream& stream, Point a) {
    stream << "(" << a.x << "," << a.y << ")";
    return stream;
}

int main() {
    Point p(3, 4); // Point 객체 생성
    cout << p << endl; // Point 객체 화면 출력

    Point q(1, 100), r(2, 200); // Point 객체 생성
    cout << q << r << endl; // Point 객체들 연속하여 화면 출력
}

10.<<演算子>を作成して例11-10:Bookクラスを作成し、Bookオブジェクトをストリームに出力する
#include <iostream>
#include <string>
using namespace std;

class Book { // 책을 표현하는 클래스
    string title;
    string press;
    string author;
public:
    Book(string title = "", string press = "", string author = "") {
        this->title = title;
        this->press = press;
        this->author = author;
    }
    friend ostream& operator << (ostream& stream, Book b); // friend 선언
};

// << 연산자 함수
ostream& operator << (ostream& stream, Book b) {
    stream << b.title << "," << b.press << "," << b.author;
    return stream;
}

int main() {
    Book book("소유냐 존재냐", "한국출판사", "예리히프롬"); // Book 객체 생성
    cout << book; // Book 객체 book 화면 출력
}

11.例11-11:Pointオブジェクトを入力する>>演算子の作成
#include <iostream>
using namespace std;

class Point { // 한 점을 표현하는 클래스
    int x, y; // private 멤버
public:
    Point(int x = 0, int y = 0) {
        this->x = x;
        this->y = y;
    }
    friend istream& operator >> (istream& ins, Point& a); // friend 선언
    friend ostream& operator << (ostream& stream, Point a); // friend 선언
};

istream& operator >> (istream& ins, Point& a) { // >> 연산자 함수
    cout << "x 좌표>>";
    ins >> a.x;
    cout << "y 좌표>>";
    ins >> a.y;
    return ins;
}

ostream& operator << (ostream& stream, Point a) { // << 연산자 함수
    stream << "(" << a.x << "," << a.y << ")";
    return stream;
}

int main() {
    Point p; // Point 객체 생성
    cin >> p; // >> 연산자 호출하여 x 좌표와 y 좌표를 키보드로 읽어 객체 p 완성
    cout << p; // << 연산자 호출하여 객체 p 출력
}