[모던C++입문] 1.7 I/O

    1.7 I / O

    표준 출력

    • 표준 출력은 cput 이라는 c++ 스트림을 사용해 접근
    • cout은 << 로 표시하는 삽입 연산자와 함께 사용
    • endl은 개행 문자를 생성 '\n'으로도 표현 가능
    • endl은 버퍼를 비우고 \n 방식은 버퍼를 비우지 않는다
    cout << "11 * 19 = " << 11 * 19 << endl;
    
    //괄호가 빠지면 빌드 오류 발생
    cout << (age > 65 ? "I'm a wise guy\n" : "I am still half-baked.\n");

    표준 입력

    • 연산자 >>를 cin 스트림에 적용하여 처리
    int age;
    cin >> age;
    
    int width, height;
    cin >> width >> height;
    
    //위의 코드와 동일하게 동작 공백으로 값을 구분
    cin >> width;
    cin >> height;

    파일 입출력

    • ofstream : 파일에 쓰기
    • ifstream : 파일로부터 읽기
    • fstream : 파일 일기 및 쓰기
    #include <fstream>
    
    int main()
    {
        ofstream square_file;
        square_file.open("squares.txt");
    
        //다음과 같이 한줄로 축소 가능
        ofstream square_file("squares.txt");
        for(int i = 0; i < 10; i++)
            square_file << i << "^2 = " << i * i << endl;
    
        square_file.close();    //스코프를 벗어날때 암시적으로 닫기에 생략 가능
    }

    일반적인 스트림

    • 모든 클래스는 istream, ostream, iostream 에서 파생하여 스트림으로 사용 가능
    • std에는 출력 가능한 모든 타입의 문자열을 만드는데 사용하는 stringstream을 포함
    • stringstream은 str()함수로 문자열을 반환
    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    void write_something(std::ostream& os)
    {
        os << "hello stream!!" << endl;
    }
    
    int main(int argc, char* argv[])
    {
        std::ofstream myfile("example.txt");
        std::stringstream mysstream;
    
        write_something(std::cout);     //cout출력
        write_something(myfile);        //파일 출력
        write_something(mysstream);     //스트링 출력
    
        std::cout << "mysstream is : " << mysstream.str();
    }

    서식 지정

    double pi = M_PI;
    cout << "pi is " << pi << endl;
    cout << "pi is " << setprecision(16) << pi << endl;
    // pi is 3.14159
    // pi is 3.141592653589793
    
    cout << "pi is " << setw(30) << pi << endl;
    // pi is                 3.141592653589193
    
    cout << "pi is " << setfill('-') << left << setw(30) << pi << endl;
    // pi is 3.141592653589793-------------
    
    cout.setf(ios_base::showpos);   //양수에도 부호값 표시
    cout << "pi is " << scientific << pi << endl;
    // pi is +3.1415926535897931e+00
    
    cout << "63 octal is " << oct << 63 << endl;        // 8진수
    cout << "63 hexadecimal is " << hex << 63 << endl;  // 16진수
    cout << "63 decimal is " << dec << 63 << endl;      // 10진수
    //63 octal is 77
    //63 hexadecimal is 3f
    //63 decimal is 63
    
    cout << "pi < 3 is " << (pi < 3) << endl;
    cout << "pi < 3 is " << boolalpha << (pi < 3) << endl;
    //pi < 3 is 0
    //pi < 3 is false
    
    cout.unsetf(ios_base::... | ios_base::... | ... );      //설정 되돌림
    // preicision는 안됨 직접 이전 설정값을 돌려놔야함

    I/O 오류 처리

    • 파일을 읽을 때 작성한 타입과 동일한 타입으로 읽도록 해야한다
    ifstream infile("some_missing_file.xyz");
    if(infile.good())
    {
        //올바르게 파일이 열린 경우
    }
    else
    {
        //파일이 존재하지 않더라도 열기 동작은 실패하지 않음
    }
    
    //예외 사용을 위해선 각 스트림에 대해 예외를 활성화 하여야 한다
    cin.exceptions(ios_base::badbit | iosbase::fallbit);
    cout.exceptions(ios_base::badbit | iosbase::fallbit);
    ifstream infile("f.txt");
    infile.exceptions(ios_base::badbit | iosbase::fallbit);
    반응형

    댓글

    Designed by JB FACTORY